Sprawdzam kolizję dla postaci platformówki, jak pokazano w # 1. Czerwone kropki to sprawdzane piksele, a szare linie wskazują osie, których dotyczą. Podobają mi się wyniki uzyskane w ten sposób podczas sprawdzania kolizji (zamiast, powiedzmy, ramki ograniczającej). Wszystko działa dokładnie tak, jak bym tego chciał, z wyjątkiem jednego problemu: wykrywania zmiażdżenia.
Na poniższych obrazach jasnoniebieskie pole reprezentuje ziemię, pomarańczowe pole jest obiektem, a strzałki wskazują kierunek ruchu.
Prostym rozwiązaniem do wykrycia, kiedy gracz jest zmiażdżony, jest sprawdzenie, czy oba punkty kolizji po przeciwnych stronach się aktywują. Jeśli tak, gracz jest miażdżony. W punkcie 2 możesz zobaczyć normalny scenariusz zmiażdżenia. Gracz jest uziemiony, a górne punkty zderzenia przecinają spadający obiekt. To wywołuje sympatię.
# 3, 4 i 5 przedstawiają problematyczne scenariusze. Na # 3 gracz porusza się w kierunku obiektu, który porusza się w górę. Punkt kolizji po prawej stronie uderza w obiekt, powodując kolizję i zatrzymując gracza.
Teraz, jeśli obiekt nadal porusza się w górę, a gracz kontynuuje ruch w prawo (jak pokazano na # 4), obiekt usuwa punkt kolizji prawej strony gracza, a gracz porusza się w prawo. Ale teraz, po zrobieniu tego, obiekt przecina górny punkt zderzenia, powodując niepożądane zgniecenie pionowe.
Podobny scenariusz pokazano w punkcie 5. Dwa obiekty są wystarczająco daleko od siebie, aby oczyścić dolne punkty kolizji, pozwalając graczowi spaść, ale nie do tego stopnia, aby pozwolić na wyczyszczenie bocznych punktów kolizji, powodując niepożądane zgniecenie w poziomie.
Rozmyślałem nad rozwiązaniem, ale nic, co wymyśliłem, nie zadziałało szczególnie dobrze, więc zastanawiam się, czy ktoś nie ma pomysłu lub wiedzy na temat rozwiązania tych problemów.
Aby wyjaśnić pewne nieporozumienia, czerwone punkty kolizji znajdowałyby się wewnątrz duszka, a szare linie były używane tylko do oznaczenia odpowiedniej osi dla każdego punktu kolizji. Na przykład, jeśli duszek postaci był prostym zielonym kwadratem, punkty kolizji wyglądałyby mniej więcej tak:
Niech punkty „testu na zgniatanie” znajdują się w szarym polu pokazanym na obrazku nr 1 - tzn. Zabij gracza tylko wtedy, gdy wykryjesz trafienie w jeden z pikseli tam.
źródło
Jako ktoś, kto dorastał w platformówkach z lat 80., mój pierwszy komentarz jest taki, że punkty kontaktowe muszą znajdować się dokładnie na ikonie, a nie poza nią. Doświadczenie było bardziej frustrujące niż śmierć, gdy broń / kruszarka / wróg znajdowały się wyraźnie kilka pikseli od twojej postaci - i takie doświadczenie powstrzymuje ludzi.
Mając to na uwadze, pomysł posiadania oddzielnych punktów dla zderzenia poziomego i pionowego po prostu nie działa. Więc twoje przypadki 3 i 5 nie istnieją.
Jeśli chodzi o wykrywanie kolizji, jak już powiedziano, musisz wziąć pod uwagę kierunek ruchu i musisz rozważyć dwie osie ruchu. Jeśli kruszarka jest opuszczona, gracz nie powinien być w stanie iść do przodu - powinien działać jak ściana. Dzięki poziomym i pionowym punktom wykrywania w tym samym miejscu nie można uzyskać przypadku 4, nawet przed dodaniem kierunku ruchu do miksu.
Kruszarka poruszająca się w górę zapewnia dodatkową złożoność. Jeśli jest tak szybki, że gracz nie ma szans na ucieczkę, to OK. Ale jeśli będzie wolniej, gracz będzie oczekiwał, że będzie mógł przejechać przez wznoszącą się platformę i zeskoczyć z drugiej strony. Duszek gracza unosi się w górę na kruszarce, a wykrywanie zmiażdżenia odbywa się pod sufitem .
źródło
Możesz sprawić, że obiekt będzie „twardszy” niż ziemia, co oznacza, że zakładając kolizję, gracz zostaje „wepchnięty” w ziemię, w przeciwieństwie do „wepchnięcia” w „poruszający się obiekt”.
Zakłada się, że gracz nie jest w stanie wepchnąć się „w” przedmioty ani ziemię.
źródło
Jeśli możesz wykryć nakładanie się obiektów bez konieczności oczekiwania na ich wyświetlenie, prostym podejściem jest przetworzenie ruchu odtwarzacza i innych obiektów niezależnie, jeden piksel na raz, a następnie osobne kontrole kolizji. Jeśli gracz porusza się swobodnie i koliduje z przedmiotem w wyniku takiego ruchu, cofnij go. Jeśli w wyniku ruchu obiektu nastąpi kolizja z obiektem, sprawdź, czy gracz może poruszać się w tym samym kierunku co ten obiekt. Jeśli tak, przesuń odtwarzacz. Jeśli nie, należy odpowiednio poradzić sobie z sytuacją „zmiażdżenia” (uszkadzając lub zabijając gracza i / lub przesuwając zderzający się obiekt do tyłu, w zależności od kontaktu).
BTW, jeśli zderza się tylko ograniczona liczba kombinacji kształtów, przydatne może być wstępne obliczenie bitmap „wykrywających kolizje”, tak aby piksel był ustawiony w pierwszej ikonce z przesunięciem (x1, y1) i w drugiej przy przesunięciu (x2, y2) sekundy piksel przy przesunięciu (x1-x2, y1-y2) zostanie ustawiony na mapie kolizji. Taka wstępnie obliczona mapa kolizji umożliwi wykrycie kolizji między dwoma duszkami poprzez sprawdzenie stanu pojedynczego piksela na mapie kolizji.
źródło
Zmiażdży gracza dwa przedmioty. Wykrywanie zgniatania powinno sprawdzić, czy gracz znajduje się między dwoma obiektami, odległość między nimi jest równa wielkości gracza, a odległość maleje.
źródło
Uważam, że do tej pory działam. Nie wymaga „zewnętrznych” informacji o ruchu kruszarek i rozwiązuje problem fałszywych alarmów. Gdy zostanie wykryty fałszywy alarm, jest on traktowany jako kolizja (i tak właśnie jest):
Chodzi o to: po co sprawdzać, czy kruszarka porusza się, kiedy tak naprawdę zależy nam na tym, czy postać się porusza. Obaj mogą odpowiedzieć, jeśli zmiażdżenie jest fałszywie pozytywne spowodowane własnym ruchem postaci lub prawdziwym zmiażdżeniem przez ruch obiektu kruszarki.
Jeśli postać się porusza i zostaje zmiażdżona (kolizje po przeciwnych stronach dla nadchodzącej klatki), sprawdź ponownie, czy nie ma zgniotu na ostatniej współrzędnej klatki / iteracji:
Jeśli nie zostanie to potwierdzone ponownie, jest to spowodowane własnym ruchem postaci i postać powinna wrócić do ostatnich współrzędnych klatki / iteracji, tak jak kolizja
Jeśli zgniatanie zostanie potwierdzone po raz drugi, kontynuuj kruszenia.
źródło