Boot unter einer Brücke in einem 2D-Fliesen-basierten RTS

10

Ich schreibe ein 2D-Kachel-basiertes RTS. Und ich möchte eine Pseudo-3D-Funktion hinzufügen - Brücken über die Flüsse.

Ich habe noch keine Codierung gestartet und versuche nur zu überlegen, wie sie zum Kollisionserkennungsmodell passt. Ein Boot, das unter der Brücke vorbeifährt, und eine Einheit, die sich über die Brücke bewegt, werden schließlich dieselbe Zelle auf der Karte besetzen. Wie kann man sie vor Kollisionen schützen?

Gibt es einen gemeinsamen Ansatz zur Lösung eines solchen Problems? Oder muss ich dazu eine 3D-Welt implementieren?

Aleguna
quelle
Wenn Sie ein kachelbasiertes System verwenden, können Sie jedes Mal so etwas wie eine "isOccupied" -Methode hinzufügen. Lassen Sie die Brücke einfach unter sich und über sich überprüfen.
Benjamin Danger Johnson
2
Wenn Bodeneinheiten nicht mit Wassereinheiten interagieren, können Sie Kollisionen für beide Einheitengruppen separat behandeln. Und vielleicht ist ein Boot am Hafen eine Bodeneinheit, um Interaktionen wie den Spieler / einen NPC zu ermöglichen, der das Boot betritt.
GameAlchemist

Antworten:

7

Grundsätzlich müssen Sie eine dritte Dimension erstellen, die im einfachsten Fall jedoch nur aus zwei Werten bestehen kann: "auf dem Boden / auf der Brücke" und "auf dem Wasser / unter der Brücke".

Eine Inspiration findet sich in der Art und Weise, wie Advanced Strategic Command dies tut: Einheiten besetzen eine bestimmte Höhenstufe, können sich nur auf Höhenstufen bewegen, die ihrem Typ entsprechen, es sei denn, es gibt bestimmte Funktionen, die es ihnen ermöglichen, etwas anderes zu tun (z. B. Landebahnen für Flugzeuge) und Das Ändern kostet normalerweise Bewegungspunkte, mit Strafen für einige Höhenstufen oder andere. Ein Plättchen kann von einer beliebigen Anzahl von Einheiten belegt werden, solange sich jede auf einer anderen Höhenstufe befindet.

Im Fall von ASC sind die Ebenen:

  • Platz
  • Höhenlage (Bombenangriffe)
  • mittlere Höhe (Abfangjäger)
  • Bodenangriffshöhe
  • Boden (die meisten Bodeneinheiten und Luftkissenfahrzeuge, auch über Wasser)
  • Wasser
  • teilweise untergetaucht (U-Boote)
  • untergetaucht ("versteckte" U-Boote)
Martin Sojka
quelle
9

Sie können jeder Kachel ein einfaches Attribut hinzufügen, das ihre Ebene angibt.

Also zum Beispiel:

tileA.layer = 0 // Will be at the bottom
tileB.layer = 1 // Will be above level 0, on top of it. 

// Add tiles to layered list
List<List<Tile>> tiles = new List<List<Tile>>();
tiles[0].add(tileA);
tiles[1].add(tileB);

// Draw 'em in the right order!
void Draw(List<List<Tile>> tiles) {
    foreach( var listOfTiles in tiles ) {
        foreach( var tile in listOfTiles ) {
            tile.draw();
        }
}

Jetzt können Sie Ihre Kacheln nach ihren Ebenenwerten sortieren und unten -> oben zeichnen! Dadurch sieht es so aus, als hätten Sie eine bestimmte Tiefe in Ihrem Spiel. Die meisten Fliesenmotoren unterstützen dies. Eine weitere coole Sache, die Sie hinzufügen können, ist die Transparenz Ihrer Texturen, sodass Sie bis zur untersten Ebene durchschauen können.

Dies kann zum Beispiel mit Wasser geschehen - stellen Sie sich das Wasser auf Stufe 1 und dann den Meeresboden auf Stufe 0 vor. Wenn die Wassertextur etwas transparent ist, können Sie den Meeresboden von oben sehen.

Zolomon
quelle
@aleguna Keine Sorge! Es macht einfach Spaß zu helfen. :)
Zolomon