Dobra fizyka platformówki 2D [zamknięta]

76

Mam podstawowy kontroler postaci skonfigurowany dla platformówki 2D z Box2D i zaczynam go poprawiać, aby poczuł się dobrze. Silniki fizyki mają wiele pokręteł do poprawienia i nie jest dla mnie jasne, pisząc z silnikiem fizyki po raz pierwszy, które z nich powinienem użyć. Czy skakanie powinno zastosować siłę dla kilku tyknięć? Impuls? Bezpośrednio ustawiona prędkość? Jak powstrzymać awatar przed przyklejaniem się do ścian bez usuwania całego jego tarcia (lub czy usuwam całe tarcie, ale tylko w powietrzu)? Czy powinienem modelować postać jako kapsułkę? Pudełko z zaokrąglonymi narożnikami? Pudełko z dwoma kołami? Tylko jedno duże koło? Czuję, że ktoś musiał to zrobić wcześniej!

Wydaje się, że w Internecie jest bardzo mało zasobów, które nie są „pierwszą fizyką dziecka”, które zostały odcięte tam, gdzie mam nadzieję, że ktoś już rozwiązał problemy. Większość przykładów silników fizyki platformówek ma kontrolę nad pływaniem, skoki w powietrzu lub łatwe do wykorzystania zachowanie, gdy tymczasowa penetracja jest zbyt wysoka itp.

Kilka przykładów tego, co mam na myśli:

  • Krótkie dotknięcie skoku skacze na krótki dystans; długi kran skacze wyżej.
  • Krótki poślizg podczas zatrzymywania lub cofania kierunków z dużą prędkością.
  • Stanie stabilnie na pochyłościach (ale może zsuwanie się po nich podczas schylania się).
  • Prędkość analogowa przy użyciu kontrolera analogowego.
  • Wszystkie inne rzeczy, które oddzielają dobre platformówki od złych platformówek.
  • Odważę się sugerować, stabilne ruchome platformy?

Nie szukam „hej, zrób to”. Oczywiście właściwa czynność zależy od tego, czego chcę w grze. Ale mam nadzieję, że ktoś gdzieś przejrzał możliwości i powiedział: „dobrze technika A ma X dobrze, technika B dobrze Y, ale to nie działa z C”, lub ma kilka sprawdzonych przykładów poza ”if (key = = spacja) znak. impuls (0, 1) ”

Josh
źródło

Odpowiedzi:

25

Implementacja, powiedzmy, „podobnej do Mario” fizyki przy użyciu prawdziwego silnika fizyki jest dość trudna.

Ostatnim razem, gdy próbowałem, używając Chipmunk, zamodelowałem odtwarzacz jako 2 koła - „koło ciała” na górze „koła stóp”

„Krąg stóp” miał pewne tarcie, był pozbawiony sprężystości i dość mały. „Koło ciała” było większe i pozbawione tarcia, aby uniknąć przyklejania się do ścian / stromych zboczy

Obiekt został ograniczony tak, aby nie pozwalał na obrót - po prostu się przesuwał

Jeśli „stopy” dotykają czegoś lub znajdowały się w ciągu ostatnich kilku klatek (aby umożliwić upadek ze zbocza), gracz został uznany za znajdującego się na ziemi (mógł mieć również normalną kontrolę powierzchni)

Minęło trochę czasu, odkąd spojrzałem na kod, ale zachowanie było następujące:

Na ziemi:

  • Zastosuj „dodatkową grawitację” (siłę skierowaną w dół, aby pomóc zbiegać ze zboczy)
  • Zastosuj tarcie o podłoże (większe tłumienie poziome)
  • Zastosuj siłę ruchu w lewo / w prawo, w oparciu o elementy sterujące.
  • (Zmniejsz siłę ruchu w lewo / w prawo, zbliżając się do maksymalnej prędkości biegu)
  • Jeśli skok zostanie wciśnięty, zastosuj impuls w górę

W powietrzu:

  • Zastosuj opór powietrza (niewielka ilość poziomego tłumienia)
  • Zastosuj regularną (lub zmniejszoną) grawitację
  • Zastosuj siłę ruchu w lewo / w prawo, jeśli pozwalasz na kontrolę w powietrzu

Musisz być ostrożny przy przełączaniu między dwoma stanami - pamiętaj, że podczas zjeżdżania ze zbocza możesz opuścić ziemię na kilka klatek - prawdopodobnie nie chcesz w tym momencie zmieniać stanów / nie zezwalać na skakanie

Kilka innych rzeczy, na które należy uważać, jednak ... platformy do przeskakiwania mogą być trudne do wdrożenia, a kiedy zaczynasz robić fajne rzeczy (ruchome platformy, wirujące światy itp.), Musisz uważać, aby upewnij się, że gracz nie zostanie uwięziony / zmiażdżony przez ruchome obiekty napędzane animacją.

bluescrn
źródło
Wiem, że to dość stara odpowiedź, ale mam na to kilka pytań. 1) Jak rozwiązać problem „utrzymuj tę samą prędkość bez względu na nachylenie terenu, na którym się znajdujesz?” 2) Jeśli używasz małego koła dla stóp i większego koła dla ciała, czy gracz nie zawiesiłby się na krawędziach czasami? Naprawdę interesuje mnie twoje podejście.
Notbad
18

Szczerze mówiąc, nie sądzę, aby użycie silnika fizyki było właściwym podejściem do czegoś w tej dziedzinie o bardzo surowych wymaganiach.

Po prostu napisz to wszystko sam. Osiągniesz znacznie lepsze wyniki, mówiąc „przesuń postać w górę o x jednostek w tym kształcie paraboli, przytrzymując przycisk skoku na długość y”, niż mając kilka pokręteł do poprawienia.

Tetrad
źródło
Robiłem to kilka razy w przeszłości. Działa do pewnego momentu, ale zawsze kończy się to wyrzucaniem czegoś innego, ponieważ „zbyt trudne” jest prawidłowe wykonanie fizyki za pomocą zhackowanego kontrolera. W tej konkretnej grze mam nadzieję, że wykorzystam mechanikę sprężyny / liny do poruszania się gracza, a to wkroczyło w sferę „Wolę zhakować prawdziwy silnik fizyki” niż „Wolę zhakować pudełko wnioskodawca".
3
Wolałbym zhakować urządzenie do przenoszenia skrzynek, przynajmniej nie może stać się niestabilne, podczas gdy silnik fizyki ma tendencję do eksplozji, jeśli rzucisz na niego zbyt wiele sił, ponieważ musisz ograniczyć ruchy do dokładnych specyfikacji (i ograniczenia silnika fizyki są sztywne, mogą tylko próbować spełnić tak wiele wymagań). Ponadto zastosowanie sił w celu rozwiązania jednego niepożądanego problemu ma wpływ na wszystko inne, co prowadzi do piekła ulepszania.
Kaj,
10

Napisałem serię artykułów na temat budowania gry platformowej od podstaw przy użyciu nowoczesnych technologii, w tym także o tym, jak poradziłem sobie z prostą fizyką:

http://www.wildbunny.co.uk/blog/2011/12/14/how-to-make-a-2d-platform-game-part-2-collision-detection/

Jeśli jednak potrzebujesz czegoś bardziej zaawansowanego technologicznie, możesz podejść do tego z pełnym silnikiem fizyki. Oto technika, której możesz użyć (z Little Big Planet), dzięki czemu postać gracza jest w pełni zintegrowaną częścią silnika fizyki:

Zamiast przykładać impulsy lub ustawiać prędkości, aby poruszać odtwarzaczem jako „zewnętrznymi wejściami” do silnika fizyki, możesz opracować ograniczenie kontrolujące postać.

Więc to ograniczenie będzie miało żądaną prędkość i kierunek gracza jako dane wejściowe (z gry) i modeluje takie rzeczy, jak maksymalna siła i prędkość gracza. Ograniczenie będzie próbowało poruszyć gracza zgodnie z jego wejściami (i przestrzeganiem maksymalnych wartości), a ponieważ jest to ograniczenie, zastosuje równą i przeciwną siłę na obiekcie, na którym stoi gracz, pozwalając graczowi stać na ruchomych platformach i wpływać na rzeczy, nad którymi się porusza.

Robiąc takie rzeczy, możesz sprawić, że gracz całkowicie naturalnie będzie w stanie poradzić sobie z sytuacjami takimi jak bycie pod ogromną stertą pudeł lub skakanie po kilku ruchomych platformach, ponieważ jest on teraz podstawową częścią silnika fizyki.

Mam nadzieję, że to pomaga!

Na zdrowie, Paul.

wildbunny
źródło
6

To pytanie było przedmiotem znacznej dyskusji na forach Box2D. Czytając dyskusje o ruchu postaci, skakaniu lub platformówce, natkniesz się na każdy możliwy problem. Jednak problem stał się na tyle skomplikowany, że system filtrowania kolizji został zaktualizowany, a przykład stanowiska testowego został stworzony wyłącznie w celu pokazania, jak należy to zrobić.

deft_code
źródło