Skoki o zmiennej wysokości w bocznych rolkach


10

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.


może przez modyfikację stopnia zmniejszenia grawitacji uzyskuje się lepszą akcję skoku.
Ali1S232,

@Gajet To jest dość niezręczne i wydaje się dziwnym sposobem na zrobienie tego.
Kaczka komunistyczna

Hmm, mówisz, że zmniejszenie grawitacji nie oznacza, że ​​używasz silnika fizyki. Czy tak jest w przypadku? Czy używasz Impulsów do skakania?
Jonathan Connell,

Nie ma silnika fizyki i nie używam Impulsów
John Stimac

W takim przypadku, jak upadasz? Czy po prostu tłumaczysz jego pozycję zgodnie z ruchem grawitacyjnym * skok *?
Jonathan Connell,

Odpowiedzi:


9

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.


Próbowałem tego i otrzymałem efekt plecaka odrzutowego. Zastanawiałem się, czy jest jakiś sposób, aby tego uniknąć.
John Stimac,

1
Może nie gra, o której myślisz, ale w Super Mario 2 skoczyłeś wyżej, skacząc nieco przed skokiem. (Co ma pewien intuicyjny sens, ponieważ nie skaczesz zbyt daleko, jeśli próbujesz to zrobić bezpośrednio z pozycji stojącej.)
Darien

3
Jcubed: Zamiast dodawać siłę do prędkości, spróbuj dodać siłę bezpośrednio do pozycji. Następnie gracz porusza się liniowo w górę, zamiast przyspieszać w górę.
Olhovsky,

@Jcubed: podczas grania w niektóre gry 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.
Ali1S232,

1
Robię to cały czas, po prostu trzymaj czas, w którym ustawiasz prędkość skoku w górę, przytrzymując przycisk wystarczająco krótki, aby nie był to zauważalny efekt plecaka odrzutowego - wtedy będzie całkiem łatwo z Super Mario, z kilkoma magiami poprawki liczby. Nie zmniejszaj „siły”, po prostu przestawiaj prędkość na maksymalną prędkość aż do wygaśnięcia jumpHigherTime lub gracz zwolni przycisk ... też czuję, że super mięsni chłopcy skaczą, by być nieprecyzyjnymi i irytującymi, jak każda platforma skacze który opiera się tylko na silniku fizyki; p
Oskar Duveborn

7

Widziałem, jak niektórzy to robią:

  1. Utwórz zmienną (nazywam ją jumpTime) (number / double / float). Po naciśnięciu klawisza skoku ustaw jumpTimena pewną liczbę (tj 0.5. Będzie to liczba sekund, na którą wpłynie przytrzymanie klawisza skoku).

  2. Następnie dla każdego kroku ustaw prędkość jumpTimepomnożoną przez inną liczbę i zmniejsz jumpTimeo delta(różnicę czasu między każdym krokiem).

  3. Powtarzaj tę czynność, aż jumpTimeosią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 jumpTimekaż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ę.


Studium przypadku: Nieskończony Mario

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.

Moja wersja javascript:

    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!


2

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.


2
Myślę, że pamiętam grę platformówki z dokładnie taką mechaniką - nie opuszczaj ziemi, dopóki nie „naładujesz” skoku. Przy niektórych ładnych animacjach (takich jak chmura pyłu rosnąca u stóp postaci) można to zrobić, aby poczuć się intuicyjnie.
Jari Komppa

2

Znalazłem inne rozwiązanie w odpowiedzi Davida Gouvei na pytanie „ Jak sprawić, by postać skakała?

Podsumowanie:

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

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.