Jak radzić sobie z ruchomymi platformami w grze platformowej?


15

Nie chcę używać box2d ani nic, chcę tylko proste ruchome platformy (ścieżki góra-dół, lewo-prawo, ścieżki ukośne i okrągłe). Moje pytanie dotyczy obsługi hierarchii kolejności aktualizacji / kontroli, aby gracz był mocno przymocowany do platformy, nie odbijając się ani nie chwiejąc?

Odpowiedzi:


16

Moim rozwiązaniem byłoby potraktowanie każdej fizycznej istoty na mapie gry jako węzła drzewa , a sama mapa jako węzła głównego . Węzły mogą zawierać inne węzły. Każdy węzeł jest zawarty (bezpośrednio lub pośrednio) wewnątrz węzła mapy.

Załóżmy na przykład, że twoja postać stoi na platformie. Węzeł platformy zawiera węzeł postaci. Tak więc, ilekroć platforma się porusza, poruszają się również zawarte w niej węzły (w tym przypadku postać).

Aby tak się stało, każdy węzeł powinien mieć pozycję (x, y) względem węzła nadrzędnego . Na przykład twoja postać może znajdować się w (1,0) względem platformy, która sama może znajdować się w (10,10) w stosunku do mapy gry. W ten sposób, jeśli platforma się poruszy, twoja postać będzie się poruszać niejawnie.

W tym hierarchicznym drzewie pozycja każdego węzła jest równa sumie jego pozycji plus pozycji każdego z jego węzłów nadrzędnych. Powiedzmy, że chcemy uzyskać pozycję postaci na mapie. Obliczamy:

(pozycja znaku) + (pozycja węzła nadrzędnego) + (pozycja węzła głównego) = (1,0) + (10,10) + (0,0) = (11,0)

OK, więc przez cały czas twoja postać stała na platformie. Co ze skokami? Cóż, w momencie, gdy skacze, odłączasz go od platformy i dołączasz do węzła zawierającego platformę ; w tym przypadku mapa (węzeł główny).

Kiedy wyląduje ponownie, podłącz go do dowolnego węzła, na którym wylądował.


1
Chciałbym również użyć prędkości xiy z węzła, aby wpłynąć na odtwarzacz. Przykład 1: platforma porusza się naprawdę szybko i zatrzymuje, gracz ma pęd w górę i zostaje uruchomiony. Przykład 2: platforma porusza się nieco wolniej niż gracz spadający ze śmiertelną prędkością. Platforma powinna bezpiecznie lądować zamiast SPLUT
AttackingHobo

to ciekawe podejście, ale wydaje się, że moja wersja całkowicie się zmieniła, aby umożliwić przenoszenie platform. Może jeśli utworzę obiekt ObjectOnPlatform jako komponent, który mogę dla dowolnego obiektu, który chwilowo daje ten efekt?
Iain

10

Sugerowałbym potraktowanie tego jako problemu pseudofizycznego i rozwiązanie go za pomocą tarcia o podłoże.

Już używasz grawitacji, aby utrzymać postać na ziemi, to obsługuje sytuacje, w których platformy poruszają się w górę i w dół. Aby obsłużyć lewy i prawy ruch, podłoże powinno wywierać duży wpływ na postać. Zazwyczaj ten poziom tarcia wynosiłby 1,0 lub 100%.

Jeśli postać stoi w miejscu, jej prędkość wynosi 0, a zamiast tego dziedziczy 100% prędkości platformy z powodu tarcia. Coś w stylu:

character_velocity = friction * platform_velocity

Zaletą tego podejścia jest to, że z łatwością nadaje się do dodatkowej mechaniki platformowania, na przykład do pokonania tarcia na stromych zboczach, umożliwiając twojej postaci ślizganie się. Pozwala także łatwo zmniejszyć tarcie, tworząc lód, po którym ślizgać się będzie postać.

Łatwiej jest również poradzić sobie z problemami takimi jak niskie wiszące ściany, które mogą zrzucić gracza z ruchomej platformy. Jeśli po prostu traktujesz tę postać jak dziecko platformy nadrzędnej, istnieje duża szansa, że ​​nie będzie ona łatwo oddziaływać z resztą wykrycia kolizji bez dużego nakładu pracy.


0

Możesz ustalić pozycję gracza nie „absolutnie na poziomie”, ale „względem platformy”, a następnie mieć funkcję, która podaje jego rzeczywistą pozycję. Nie podoba mi się to.

Prawdopodobnie byłoby lepiej (i prościej) powiązać gracza z platformą, aby gdy platforma poruszała się + x / + y, gracz poruszał się tak samo.

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.