Jak mogę wykryć zmiażdżenie gracza w platformówce 2D?

19

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.

wprowadź opis zdjęcia tutaj

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:

wprowadź opis zdjęcia tutaj

IanLarson
źródło

Odpowiedzi:

34

Myślę, że będziesz musiał wziąć pod uwagę ruch pudełka . Oznacza to, że zmiażdżysz tylko wtedy, gdy pudełko przesuwa się w kierunku gracza.

Jest to podobne do innych problemów platformówek, w których ruch jest ważny. Np. W przypadku platform, na które można przeskakiwać z dołu i na dół, nie sprawdzaj kolizji, jeśli gracz porusza się w górę.

Blok może więc zmiażdżyć gracza z góry tylko wtedy, gdy blok przesuwa się w dół; od dołu tylko wtedy, gdy blok przesuwa się w górę; od lewej tylko wtedy, gdy blok przesuwa się w prawo i tak dalej.

congusbongus
źródło
13
+1 Weź pod uwagę, że blok działa tutaj, a nie gracz. Jeśli więc sprawdzisz, czy skrzynia miażdży gracza, zamiast sprawdzać, czy gracz jest miażdżony, problem powinien być łatwiejszy do rozwiązania
Niels
A co, gdy bloki się nie ruszają? Zdaję sobie sprawę, że teraz umieściłem strzałki na blokach w # 5, ale to miały być dwa stacjonarne bloki.
IanLarson
Jeśli zdecydujesz, że stacjonarne bloki nie powinny się zmiażdżyć, po prostu upewnij się, że gracz nie utknął i może zejść z drogi.
congusbongus
Argh, nienawidzę zostać zmiażdżonym przez dwa obiekty, które faktycznie oddalają się od siebie, tylko dlatego, że stworzyłem tam idealną piksel i ramkę, a programista był leniwy.
nosorożec
9

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.

Piotr jest
źródło
1
Czy masz na myśli dodanie punktów kontrolnych zmiażdżenia „wewnątrz” granic punktów kolizji? Problem, który widzę w tym, polega na tym, że rozdzielczość kolizji nastąpi w każdej osi, gdy jeden z jej punktów kolizji zostanie „wyzwolony”, zanim obiekt będzie miał nawet szansę dotrzeć do wewnętrznych punktów kontrolnych zgniotu.
IanLarson
6

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 .

Graham
źródło
3
Drobny punkt - nie wiesz, jak wygląda jego duszek. Z tego, co wiemy, może być dokładnie tak, jak pokazano na powyższych zdjęciach, więc przypadki 3 i 5 mogą być całkowicie poprawne.
Alex
1
Alex ma rację. Dokonałem edycji, aby wyjaśnić. Zgadzam się, że nie ma nic gorszego niż niestałe skrzynki kolizyjne. Myślę, że rozumiem twój punkt widzenia o niestosowaniu oddzielnych punktów dla różnych osi. Jeśli tak, zmieniłbym powyższy przykład z posiadania ośmiu punktów na cztery, po jednym w każdym rogu, prawda? Zrobiłem to z myślą o tym (z mniej niż pożądanymi wynikami), ale bardzo się waham, ponieważ „oddzielenie” narożników pozwala uzyskać zachowanie, którego szukam prawie idealnie. To naprawdę jedyne scenariusze problemów, na które natknąłem się.
IanLarson
0

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ę.

Zamfi
źródło
0

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.

supercat
źródło
0

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.

Akumulacja
źródło
0

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:

  1. 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

  2. Jeśli zgniatanie zostanie potwierdzone po raz drugi, kontynuuj kruszenia.

Nikaas
źródło