Jak sprawić, by gracz skoczył wyżej, jeśli klawisz skoku jest przytrzymywany dłużej? Obecnie zmniejszam grawitację, dopóki klawisz jest trzymany, a gracz skacze, ale wygląda to dziwnie.
Jak sprawić, by gracz skoczył wyżej, jeśli klawisz skoku jest przytrzymywany dłużej? Obecnie zmniejszam grawitację, dopóki klawisz jest trzymany, a gracz skacze, ale wygląda to dziwnie.
Odpowiedzi:
Najpierw musisz zdecydować, jak ma wyglądać skok.
W prawdziwym życiu wysokość skoku jest ustalana w momencie opuszczenia ziemi. Nie możesz skakać wyżej, gdy jesteś już w powietrzu.
Jeśli więc możesz kontrolować wysokość skoku, gdy jesteś już w powietrzu, uzyskasz efekt przypominający „jet-pack”.
Wydaje mi się, że pamiętam sidecroller, który miał dwie różne wysokości skoku, myślę, że była to jedna z super gier Mario. Wyższy skok miał miejsce, gdy trzymałeś przycisk skoku, a skok był wtedy właściwie dwuczęściowym skokiem, zaczynając od początkowego zwykłego skoku, a następnie drugiego impulsu, który zabrał cię wyżej.
Jak chcesz, aby twój skok wyglądał? Jaką kontrolę chcesz, aby gracz miał nad skokiem?
Zacznę od tego:
Pozostaw grawitację w spokoju (tzn. Nigdy jej nie zmieniaj). Kiedy gracz naciśnie przycisk skoku, zastosuj siłę skoku, dopóki gracz naciska przycisk skoku (do pewnego limitu czasu). Następnie, gdy gracz zwolni przycisk skoku, nie może ponownie zastosować żadnej siły skoku (tj. Nie może ponownie zainicjować skoku), dopóki nie dotknie podłoża, po czym skoki zostaną ponownie włączone.
super meat boy
, które, jak sądzę, mają taki sam efekt skoku, jaki chcesz, wydaje się, że dopóki przytrzymasz przycisk skoku, siła jest przykładana do postaci, jest przeciwna do grawitacji i mniejsza od niej, a reszta jest jak powiedział Alhovsky. gdybym wdrożył coś takiego, zaczynałbym od czegoś w rodzaju 60% -80% grawitacji jako siły skoku.
Widziałem, jak niektórzy to robią:
Utwórz zmienną (nazywam ją jumpTime
) (number / double / float). Po naciśnięciu klawisza skoku ustaw jumpTime
na pewną liczbę (tj 0.5
. Będzie to liczba sekund, na którą wpłynie przytrzymanie klawisza skoku).
Następnie dla każdego kroku ustaw prędkość jumpTime
pomnożoną przez inną liczbę i zmniejsz jumpTime
o delta
(różnicę czasu między każdym krokiem).
Powtarzaj tę czynność, aż jumpTime
osiągnie zero lub mniej, lub gdy gracz zwolni klawisz skoku. Po tym zdarzeniu użyj normalnej fizyki (stosuj stałe przyspieszenie ujemne, dopóki gracz nie dotrze do ziemi).
Może być konieczne użycie metody prób i błędów (lub „logicznego zgadywania”) w celu znalezienia odpowiednich wartości dla tych „niektórych liczb”, chyba że wiesz, jak to zrobić.
AKTUALIZACJA: Znalazłem sztuczkę, która sprawia, że skok jest trochę bardziej realistyczny (ponieważ początkowo jest wolny, ale szybko spada). Infinite Mario używa również następującego wiersza (293 znaków Character.js wersji JavaScript) ... this.Ya *= 0.85;
To jest po prostu jak „przeciąganie powietrzem” i ogranicza / spowalnia prędkość postaci w powietrzu. Więc każdej klatce, należy pomnożyć y-prędkość (prędkość pionowa) przez liczbę mniejszą niż jeden tak, że kiedy spada zwalnia z powrotem w dół (a więc zarówno idzie w górę i idzie w dół podczas skoku będzie podobna i bardziej realistyczny). Wiem, że jestem kiepski w tłumaczeniu ...
Kiedy postać skacze za pomocą metody, którą pierwotnie opisałem powyżej, „podnosi się” szybciej niż „spada z powrotem w dół”. Przeciąganie spowalnia jednak prędkość pionową. Ponieważ ustawiliśmy prędkość pionową na proporcjonalną do jumpTime
każdej klatki, opór ten nie ma większego wpływu na pierwszą połowę skoku. Jednak w następnej połowie (opadanie w dół) prędkość pionowa nie jest ustawiana dla każdej klatki, ale po prostu dodawana o inną liczbę (w tym przypadku jest to stała grawitacyjna). Dlatego opór działa podczas opadania, a ponieważ zmniejsza prędkość (w dowolnym kierunku), spowalnia opad, czyniąc go podobnym do pierwszej połowy.
Istnieją jednak inne sposoby rozwiązania tego problemu, takie jak zmniejszenie wpływu grawitacji na upadającą postać. Musimy jednak dowiedzieć się, o ile powinniśmy zmniejszyć grawitację.
Oto, co znalazłem (z linii 206 Mario.java autorstwa Markusa Perssona (Notch)):
if (keys[KEY_JUMP] || (jumpTime < 0 && !onGround && !sliding))
{
if (jumpTime < 0)
{
xa = xJumpSpeed;
ya = -jumpTime * yJumpSpeed;
jumpTime++;
}
else if (onGround && mayJump)
{
world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
xJumpSpeed = 0;
yJumpSpeed = -1.9f;
jumpTime = 7;
ya = jumpTime * yJumpSpeed;
onGround = false;
sliding = false;
}
else if (sliding && mayJump)
{
world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
xJumpSpeed = -facing * 6.0f;
yJumpSpeed = -2.0f;
jumpTime = -6;
xa = xJumpSpeed;
ya = -jumpTime * yJumpSpeed;
onGround = false;
sliding = false;
facing = -facing;
}
else if (jumpTime > 0)
{
xa += xJumpSpeed;
ya = jumpTime * yJumpSpeed;
jumpTime--;
}
}
else
{
jumpTime = 0;
}
Wersja javascript jest w zasadzie taka sama https://github.com/robertkleffner/mariohtml5/blob/master/code/character.js
Jest to podobne do sugestii Olhovsky'ego, ale w tym przypadku siła będzie proporcjonalna do ilości czasu, jaki upłynął po tym, jak gracz nacisnął klawisz skoku.
if ( onGround && jump && !jumped ) {
jumpTime = maxJumpTime;
onGround = false;
jumped = true;
this.vel.y = jumpTime * jumpConstant;
A = true;
} else if ( !onGround && jump && jumpTime > 0 && !released ) {
jumpTime -= evt.delta;
this.vel.y = jumpTime * jumpConstant;
B = true;
} else if ( !onGround && ( !jump || jumpTime <= 0 ) ) {
this.vel.y -= gravityConstant * evt.delta;
jumpTime = 0
released = true;
} if ( this.pos.y < 0 && !A && !B ) {
onGround = true;
released = false;
this.pos.y = 0;
this.vel.y = 0;
}
if ( !jump && onGround ) jumped = false;
Jednak niektóre wartości stałych (np. „GravityConstant” i „jumpConstant”) dadzą nierealistyczny skok. Ale czasami gry nie muszą być realistyczne! ( aktualizacja patrz sekcja aktualizacji powyżej)
To pytanie ma już ponad rok, ale mam nadzieję, że to pomoże!
Jak powiedział Olhovsky, o wysokości skoku decyduje moment, kiedy opuścisz ziemię, a nie potem.
Jeśli naprawdę chcesz uniknąć efektu plecaka odrzutowego, widzę tylko dwa sposoby: kombinację klawiszy, aby skoczyć wyżej lub zasadniczo zmieniając sposób działania klawisza skoku:
Zamiast zmuszać gracza do skoku po naciśnięciu klawisza, opóźnij skok do momentu zwolnienia klawisza . Zasadniczo czas trwania naciśnięcia klawisza kontroluje, jak duże napięcie sprężyny w nogach gracza jest budowane, a następnie uwalniane.
Oczywiście, to zasadniczo zmienia mechanikę gry i może być nieznane dla gracza. Ale efekt może być dość interesujący i może być wart nieznajomości.
Znalazłem inne rozwiązanie w odpowiedzi Davida Gouvei na pytanie „ Jak sprawić, by postać skakała? ”
Jego pomysłem było ustawienie prędkości, gdy gracz naciska przycisk skoku. W każdej ramce oblicza tylko grawitację. Jednak gdy gracz zwolni przycisk, ustawia prędkość na mniejszą wartość, jeśli prędkość jest od niej większa. Prędkość jest zmniejszana tylko przez każdą ramkę grawitacją.
Nie powinienem kraść jego odpowiedzi, więc czytaj dalej. Jego rozwiązanie znajduje się w sekcji „ Skok o zmiennej wysokości ”.
Tak naprawdę ludzie wymyślili wiele różnych sposobów rozwiązania tego problemu ...
http://excitemike.com/JumpingControlTester (ilustruje różne mechanizmy skoków w różnych grach)
http://meyermike.com/wp/?p=175 (omawia również ścieżkę skoku Mario)
http://www.flatredball.com/frb/docs/index.php?title=Tutorials:Platforer:Variable-Height_Jumps (opisuje 3 różne metody)
być może więcej (nie przeszedłem zbyt wielu wyników wyszukiwania, ale Google pomaga „zmienna wysokość skoku”)