Rozwijam mały silnik do gier 2D. Znaki mają metodę malowania, która obecnie wykonuje następujące czynności:
- Oblicz nową pozycję postaci według jej prędkości itp.
- Zaktualizuj komórkę siatki kolizyjnej **
- Narysuj postać na nowej pozycji
** Utworzyłem siatkę kolizyjną, aby zmniejszyć liczbę kontroli skrzyżowań
Podstawowym algorytmem, który myślałem o wykrywaniu kolizji, jest:
For Each Character
Check intersection with characters in surrounding 8 cells
Mogę po prostu umieścić ten kod w metodzie malowania. Ale oto problem, który przewiduję.
Załóżmy, że dwa znaki A i B leżą w sąsiednich komórkach w siatce kolizyjnej. Teraz zgodnie z powyższym algorytmem w iteracji znaku A wykryje, że zderzył się z B. W iteracji znaku B wykryje, że zderzył się z A.
Mam jednak pomysł, że gdy A wykryje, że zderzył się z B, powinien poinformować B, że zderzył się z A. To zaoszczędziłoby wielu porównań, gdy zderza się więcej niż 2 aktorów. Ale nie jestem pewien, jak sobie z tym poradzić. Myślę, że zamiast każdej postaci sprawdzającej kolizję, powinienem sprawdzić kolizję w pętli gry.
Czy takie podejście byłoby prawidłowe? Jak poradziłeś sobie z tego rodzaju problemem? Sam pomyślałem o siatce kolizyjnej. Czy są jakieś alternatywy dla logiki siatki kolizji?
Odpowiedzi:
Zwykle podejście do wykrywania kolizji polega na tym, aby nie wykrywać kolizji A lub B samodzielnie.
Zamiast tego najpierw przesuwasz wszystkie obiekty, a następnie osobny system kolizji szuka kolizji między wszystkimi parami obiektów, informując każdy obiekt o przedmiotach, z którymi się zderzył, a następnie renderuje wszystkie obiekty.
Zasadniczo zamiast wykonywać ruch, sprawdzać kolizje, rysować wewnątrz funkcji Paint (), dzielisz ruch i rysujesz na osobne funkcje, które wywołujesz osobno (najpierw „ruch” dla każdego obiektu, a następnie „rysuj” dla każdego obiektu). A między nimi sprawdź kolizje.
Uwaga zaawansowana: Jeśli którykolwiek z twoich obiektów porusza się w reakcji na wykryte kolizje, może być konieczne powtórzenie kroku „szukaj kolizji między wszystkimi parami obiektów”, na wypadek, gdyby reakcja kolizji obiektu spowodowała kolejną kolizję.
źródło
Prowadzę pętlę dla wszystkich moich postaci w pętli gry, tak jak mówisz.
Sposób, w jaki to robię, polega na stanie na każdej z moich postaci, więc jeśli A i B zderzą się, podczas gdy A sprawdza, czy kolizja A i B są ustawione na uderzenie. na początku pętli B sprawdza, czy jest już trafiony, jeśli tak, id nie uruchamia pętli.
Umieszczam kod afektu w pętli, więc wszelkie działania, które należy podjąć na B, miały miejsce w pętli A, więc B nie powinien mieć powodu do sprawdzania, ponieważ mogłoby to zepsuć wynik kolizji, może to być jednak inne dla ciebie .
źródło