Jak radzić sobie z wykrywaniem zderzeń izometrycznych?


14

Chciałbym stworzyć platformówkę w stylu izometrycznym. Gracz powinien być w stanie wskoczyć na platformy nad podłogą, uderzyć w bok przedmiotów itp.

Będę używać silnika do gier 2D, więc nie chciałbym emulować pełnej kolizji 3D dla wymiarów, których nie używam.

Myślę, że obiekty w grze powinny być umieszczane przy użyciu: X, Y, szerokość, wysokość i Z dla głębokości.

Używając tych wartości, jak powinienem wykryć kolizje?


Wiem, że jest to ogólne pytanie, ale chciałbym uzyskać bardziej szczegółowe odpowiedzi lub linki do dobrych zasobów edukacyjnych.
jdeseno

Odpowiedzi:


19

2 opcje:

  • Można to potraktować jako grę 3D ze stałą kamerą ortograficzną. Następnie możesz użyć dowolnych standardowych zasobów / książek / samouczków / bibliotek do gier 3D. Nawet jeśli byłby renderowany w 2D za pomocą duszków, matematyka ruchu itp. Nadal byłaby trójwymiarowa za sceną. To zapewni Ci najdokładniejsze wyniki.

  • Możesz potraktować to jako grę 2D z odgórnym widokiem, z dodatkową właściwością wysokości. Na przykład wyobraź sobie siatkę 2D, w której każda płytka ma wartość wysokości. Przechodząc z jednej płytki na drugą, pozwalasz postaci przejść do określonej płytki tylko wtedy, gdy stopy postaci są wyższe lub równe wysokości tej płytki, ale jeśli skaczą, a grawitacja sprowadza je na płytkę, możesz niech tam pozostaną. Przy odrobinie pracy możesz to zrobić, aby przejść pod mostami itp.


4

Istnieje wiele sposobów na uproszczenie tego. Na przykład, jeśli nie zezwalasz na warstwy (na przykład mostek, po którym można przechodzić zarówno pod, jak i pod, możesz wykonać wykrywanie kolizji w wymiarach X / Y, gdzie filtrujesz zestaw kolizji do dowolnej jego wysokości + głębokości lub wyżej.


2

Jeśli gra opiera się na prostokątnej siatce, ta siatka określa twoje osie X / Y. I Z może być użyte do wysokości.

Zderzenia są wtedy mniej więcej tak proste, jak każda gra 2D oparta na kafelkach.

Następnie wystarczy przekonwertować z siatki z powrotem na współrzędne ekranu izometrycznego do renderowania. Jest to dość proste - ale możesz potrzebować pomyśleć o obliczeniu wartości „głębokości” do celów sortowania (renderowanie sceny izometrycznej od tyłu do przodu)


Używanie Z do wysokości jest sprzeczne z instynktem, ale dobrze jest to robić w odgórnych grach 2D. następnie możesz ponownie użyć kodu między grami side-on i top-down.
Iain

2

Googling dookoła Znajduję to demo: http://planetskill.com/iso/

WASD się ruszyć. Spacja, aby skoczyć

Wprowadza tylko kolizję z osią góra / dół, ale dodanie innej kolizji powinno być łatwe:

Jeśli pozycja góra / dół następnego kroku jest wyższa niż maksymalna, po prostu nie ruszaj się. Powinno to również umożliwić łatwe wdrażanie skoków.

Przykładowy kod tutaj: http://gist.github.com/478997


2

Wszystkie powyższe. Izometryczny jest tylko ściętą siatką 2d, więc traktuj ją jak mapę dwuwymiarową i wymyśl sposób na zakodowanie głębokości. Jak byś to zrobił w zwykłej grze 2D (będąc w stanie skoczyć za lub przed blokami podczas „skakania”? Albo zapisywałbyś głębokość na płytkę (bufor głębokości -> bufor Z) lub używałbyś wielu warstw , lub, jeśli chcesz, byś był fanem, zaimplementowałbyś funkcję zwrotną dla każdego typu mapy (lub położenia mapy) i byłbyś w stanie robić, co chcesz, sprawdzać głębokość, sprawdzać wyposażenie, odtwarzać osnowy, odtwarzać powoli odtwarzacz w górę, formatować HD.


Dobra odpowiedź Kaj - to sedno sprawy, jestem zaskoczony, że nikt inny tego nie poruszył. Jest to zawsze rzecz, która wprowadza w błąd początkujących w zakresie izometrii w odniesieniu do fizyki.
Inżynier

1

Cóż, możesz mieć oddzielną warstwę kolizji powyżej swojego poziomu, która nie jest widoczna, i użyj jej do sprawdzenia kolizji. Możesz także użyć tej opcji dla wielu warstw, o ile wiesz, na której warstwie jest gracz;)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.