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?
collision-detection
isometric
jdeseno
źródło
źródło
Odpowiedzi:
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.
źródło
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.
źródło
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)
źródło
Googling dookoła Znajduję to demo: http://planetskill.com/iso/
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
źródło
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.
źródło
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;)
źródło