Impulsowe skakanie


12

Zastanawia mnie jedna rzecz, a mianowicie wprowadzenie skoku „pod impulsem” w platformówce. Jeśli nie wiesz, o czym mówię, pomyśl o skokach Mario, Kirby i Cytat z Cave Story. Co oni mają ze sobą wspólnego? Wysokość skoku zależy od tego, jak długo trzymasz wciśnięty przycisk skoku.

Wiedząc, że „impulsy” tych postaci są budowane nie przed ich skokiem, jak w rzeczywistej fizyce, ale raczej w powietrzu - to znaczy, możesz bardzo dobrze podnieść palec w połowie maksymalnej wysokości i zatrzyma się, nawet jeśli z desacceleration między nim a kropką; dlatego możesz po prostu stuknąć w skok i przytrzymać go w skoku w dal - jestem zahipnotyzowany tym, jak utrzymują swoje trajektorie jako łuki.

Moja obecna implementacja działa następująco:

wprowadź opis zdjęcia tutaj

Gdy przycisk skoku jest wciśnięty, grawitacja jest wyłączona, a współrzędna Y awatara jest zmniejszana o stałą wartość grawitacji. Na przykład, jeśli rzeczy spadną do Z jednostek na tik, wzrośnie Z jednostek na tik.

Gdy przycisk zostanie zwolniony lub limit zostanie osiągnięty, awatar spadnie w stopniu, który sprawi, że obejmie X jednostek, dopóki jego prędkość nie osiągnie 0; kiedy to zrobi, przyspiesza, aż jego prędkość dopasuje się do grawitacji - przyklejając się do przykładu, mogę powiedzieć, że przyspiesza od 0 do Z jednostek / tik, jednocześnie pokrywając jednostki X.

Ta implementacja powoduje jednak, że skoki są zbyt ukośne i chyba że prędkość awatara jest większa niż grawitacja, co w moim obecnym projekcie byłoby zbyt szybkie (porusza się z około 4 pikselami na tyknięcie i grawitacja wynosi 10 pikseli na tyknięcie, przy klatek na sekundę 40 klatek na sekundę), dzięki czemu jest bardziej pionowy niż poziomy. Osoby zaznajomione z platformowcami zauważyłyby, że łuk postaci przeskakuje prawie zawsze pozwala im skakać dalej, nawet jeśli nie są tak szybkie, jak grawitacja gry, a gdy nie, jeśli nie gra się właściwie, okazuje się, że jest bardzo sprzeczne z intuicją. Wiem o tym, ponieważ mogę potwierdzić, że moje wdrożenie jest bardzo denerwujące.

wprowadź opis zdjęcia tutaj

Czy ktoś próbował kiedyś podobnej mechaniki, a może nawet się udało? Chciałbym wiedzieć, co kryje się za tego rodzaju platformówką. Jeśli nigdy wcześniej nie miałeś z tym żadnego doświadczenia i chcesz spróbować, nie próbuj poprawiać ani ulepszać mojej wyjaśnionej implementacji, chyba że byłem na dobrej drodze - spróbuj wymyślić swoje rozwiązanie z zadraśnięcie. Nie obchodzi mnie, czy użyjesz grawitacji, fizyki czy co tam jeszcze, dopóki pokazuje to, jak działają te pseudo-impulsy, to działa.

Chciałbym również, aby w jego prezentacji unikano kodowania specyficznego dla języka; na przykład, dzieląc się z nami przykładem C ++ lub Delphi ... O ile używam frameworka XNA do mojego projektu i nie miałbym nic przeciwko C #, nie mam dużo cierpliwości, aby czytać kod innych, i jestem niektórzy twórcy gier w innych językach byliby zainteresowani tym, co tutaj osiągamy, więc nie przejmuj się trzymaniem się pseudo-kodu.

Z góry dziękuję.


3
Czy spojrzałeś na następujące pytanie i jego odpowiedzi? gamedev.stackexchange.com/questions/29617/…
bummzack

@bummzack Jest to również bardzo przejrzyste.
Mutoh,

1
możliwy duplikat obsługi skoku i grawitacji Chociaż nie ma ładnych zdjęć, jest to to samo pytanie.
MichaelHouse

Odpowiedzi:


8

Myślę, że twój główny problem leży tutaj:

Gdy przycisk skoku jest wciśnięty, grawitacja jest wyłączona, a współrzędna Y awatara jest zmniejszana o stałą wartość grawitacji. Na przykład, jeśli rzeczy spadną do Z jednostek na tik, wzrośnie Z jednostek na tik.

Grawitacja tak nie działa. Google „równomiernie przyspieszał ruch” detali, ale w prostych słowach, jak powiedział inny członek, grawitacja jest przyspieszeniem, a nie prędkością.

Mówiąc prościej, podczas gdy prędkość jest stałą szybkością zmiany pozycji w czasie, przyspieszenie jest stałą szybkością zmiany prędkości w czasie.

Więc twoim pierwszym zadaniem będzie zmiana algorytmu spadania, tak aby obejmował przyspieszenie, a nie tylko prędkość. Zamiast:

pos_y = pos_y + (velocity_y * time_difference)

musiałbyś zrobić coś takiego

pos_y = pos_y + (velocity_y * time_difference) + (gravity_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (acceleration_y * time_difference)

W ten sposób wszystko spadnie w parabolę, która jest fizycznie poprawnym ruchem.

Teraz, aby wdrożyć proste przeskakiwanie (zaraz przejdziemy do dokładnego pytania), wystarczy ustawić velocity_yżądaną wartość. Tak długo, jak znak dla acceleration_yi pożądane wartości velocity_ysą różne, obiekt będzie skakał poprawnie (innymi słowy, nie „wyłączasz grawitacji”. Utrzymujesz ją i po prostu ustawiasz prędkość obiektu na określoną wartość).

Zauważysz, że im większy velocity_yjest skok, tym wyższy będzie skok. Aby więc zrealizować pożądany efekt, dodajesz jakieś przyspieszenie do skoku (fizycznie oznacza to dodanie siły. Pomyśl o dodaniu małej rakiety do obiektu).

Aby to zrobić, robisz to samo, co wcześniej, ale teraz przyspieszenie i prędkość powinny mieć ten sam znak. Robisz to, gdy przycisk jest wciśnięty:

pos_y = pos_y + (velocity_y * time_difference) + (force_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (force_y * time_difference)

4

Rozwiązaniem nie jest opóźnianie opóźnienia. Kiedy rzucasz piłkę w powietrze, nie porusza się ona ze stałą prędkością, dopóki nie osiągnie maksymalnej wysokości, ale zwalnia od momentu impulsu.

Grawitacja nie jest prędkością, ale przyspieszeniem. Więc jeśli gracz ma prędkość w górę o 20 jednostek, a grawitacja wynosi -10 jednostek, w następnym tiku prędkość w górę wynosiłaby 10 jednostek, w następnej 0 jednostek itp.

Powodem, dla którego twoje skoki wydają się tak ukośne, jest to, że prędkość twojego gracza rośnie i spada jest stała. Jeśli więc dosłownie narysujesz linię podążającą ścieżką gracza, zobaczysz linię ze spadkiem (dodatnim lub ujemnym) wartości grawitacji ponad zmianą pozycji x.

Aby gracz mógł kontrolować wysokość skoku, powinien otrzymać pewną prędkość początkową pod wpływem impulsu, grawitację należy wyłączyć, a do prędkości gracza należy zastosować specjalną wartość grawitacji (mniejszą niż zwykła grawitacja). Po zwolnieniu przycisku skoku lub osiągnięciu przez gracza prędkości 0, należy zastosować normalną grawitację.

W ten sposób gracz zobaczy ładną krzywą podczas skoku, niezależnie od tego, czy zwalnia z regularnej grawitacji, czy nie.


2

Krótka historia: gdzieś w swoim skoku masz gdzieś nieparaboliczną sekcję.

Wypróbowałem kilka podejść przy wdrażaniu skoków:

  • Stałe wznoszenie: Wydaje się, że w rzeczywistości to, czego próbowałeś: ustalenie dodatniej prędkości pionowej do momentu zwolnienia przycisku, w którym to momencie rozpoczyna się normalna grawitacja. Łuk jest ukośny na wejściu, ale normalny na spadku - to faktycznie wygląda OK i (co ważniejsze) wydaje się OK, ponieważ dość łatwo jest dobrze ocenić wysokość skoku.

  • Aresztowana wspinaczka: tutaj zaczynasz postać od wspinania się po paraboli o maksymalnej wysokości, stosując początkowy impuls. Następnie, gdy przycisk zostanie zwolniony, ustawiasz prędkość pionową na zero (lub małą prędkość w górę). Oznacza to, że twoje największe skoki są gwarantowaną parabolą, a mniejsze skoki bardziej przypominają wykonanie dużego skoku niż zwolnienie.

  • Zmienny początkowy impuls: to ten, na którym ostatecznie zdecydowałem się: naciśnięcie skoku zastosowałoby początkowy impuls wystarczający do przeskoku, a następnie kontynuowałoby przyspieszenie w górę (znacznie większe niż grawitacja) przez krótki czas - okno skoku - aż do przycisk został zwolniony. Po zamknięciu okna skoku ruch byłby wówczas paraboliczny, a okres zmiennego impulsu początkowego był na tyle krótki, że nie wyglądał dziwnie, ale był wystarczająco długi, aby dać doświadczonemu graczowi wystarczającą swobodę kontrolowania wysokości skoku. Minusem było to, że nie było tak łatwo ocenić wysokość skoku, ponieważ okno było znacznie mniejsze i nie miało związku momentu uwalniania z wysokością. Jak to zwykle bywało, i tak chciałeś stuknięcia lub pełnego skoku, więc to nie był taki problem.

Wypróbuj je i przekonaj się, które z nich jest najlepsze.

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.