Łódź przechodząca pod mostem w systemie RTS opartym na kafelkach 2D

10

Piszę RTS oparty na kafelkach 2D. I chcę dodać do niego funkcję „pseudo 3D” - mosty nad rzekami.

Nie zacząłem jeszcze kodowania, próbuję tylko pomyśleć, jak pasuje do modelu wykrywania kolizji. Łódź przepływająca pod mostem i jednostka poruszająca się nad mostem ostatecznie zajmą tę samą komórkę na mapie. Jak chronić je przed kolizją?

Czy istnieje wspólne podejście do rozwiązania takiego problemu? Czy muszę zaimplementować świat 3D, aby to zrobić?

Aleguna
źródło
cóż, jeśli robisz system oparty na kafelkach, możesz za każdym razem dodać coś w rodzaju metody „isOccupied”. Po prostu sprawdź mostek poniżej siebie i powyżej.
Benjamin Danger Johnson
2
jeśli jednostki naziemne nie wchodzą w interakcje z jednostkami wody, możesz osobno poradzić sobie z kolizjami dla obu zestawów jednostek. Być może łódź na przystani jest jednostką naziemną, umożliwiającą interakcje, takie jak gracz / npc wchodzący do łodzi.
GameAlchemist

Odpowiedzi:

7

Zasadniczo będziesz musiał stworzyć trzeci wymiar, chociaż w najprostszym przypadku może on składać się tylko z dwóch wartości: „na ziemi / na moście” i „na wodzie / pod mostem”.

Inspirację można znaleźć w sposobie, w jaki robi to Advanced Strategic Command : jednostki zajmują określony poziom wysokości, mogą poruszać się tylko na poziomach wysokości odpowiadających ich typowi, chyba że istnieją szczególne cechy pozwalające im robić inaczej (na przykład drogi startowe dla samolotów) i ich zmiana zwykle kosztuje punkty ruchu, z karami na niektórych poziomach wysokości lub innych. Płytka może być zajęta przez dowolną liczbę jednostek, o ile każda z nich ma inny poziom wysokości.

W przypadku ASC poziomy są następujące:

  • przestrzeń
  • duża wysokość (bombardowanie)
  • średnia wysokość (przechwytywacze)
  • wysokość ataku naziemnego
  • ziemia (większość jednostek naziemnych i poduszkowców, nawet nad wodą)
  • woda
  • częściowo zanurzony (okręty podwodne)
  • zanurzone („ukryte” okręty podwodne)
Martin Sojka
źródło
9

Możesz dodać prosty atrybut do każdego kafelka, który określa jego poziom.

Na przykład:

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();
        }
}

Teraz możesz posortować kafelki w zależności od wartości warstw i narysować je na dole -> na górze! Dzięki temu będzie wyglądać, jakbyś miał pewną głębię w swojej grze. Obsługuje to większość silników kafelkowych. Kolejną fajną rzeczą, którą możesz dodać, jest przezroczystość tekstur, abyś mógł przejrzeć dolną warstwę.

Można to zrobić na przykład za pomocą wody - wyobraź sobie wodę na poziomie 1, a następnie dno oceanu na poziomie 0. Jeśli tekstura wody jest nieco przezroczysta, będziesz mógł zobaczyć dno oceanu z góry.

Zolomon
źródło
@aleguna Bez obaw! Pomoc jest po prostu fajna. :)
Zolomon