Jak sprawić, by postać skoczyła?


44

Obecnie tworzę grę w C # przy użyciu Direct X 9.0. Remake gry to Donkey Kong NES. Prawie wszystko zostało ukończone, ale mam problemy z fizyką skoku Mario. Mam zmienne zadeklarowane dla koordynacji Y i X.

Zastanawiałem się, czy istnieje prosta metoda zrobienia tego. Szukałem wysokiej i niskiej odpowiedzi, ale odpowiedzi, które znalazłem, są nieistotne / lub używają innego języka programowania, takiego jak XNA.

Obecnie mam ustawioną zmienną bool, aby sprawdzić, czy W został naciśnięty, a następnie uruchomi dowolny kod, aby go skoczył. Bałaganiłem takich jak.

  if (jump == true)
    {

        Playerypos -=  vel;
        Playerxpos +=  vel;
    }

Co nie działało tak dobrze. Szukałem odpowiedzi wysoko i nisko i teraz jestem zdesperowany, jeśli ktoś mógłby skierować mnie w dobrym kierunku na proste rozwiązanie. Byłoby świetnie. Bardzo ceniony za wszelkie odpowiedzi.


5
Odpowiedzi w innym języku programowania nie powinny stanowić problemu. Algorytm jest tym, co jest interesujące, a nie konkretna implementacja ... chyba że masz tylko nadzieję, że skopiujesz i wkleisz, nie rozumiejąc niczego, co z pewnością mam nadzieję, że nie! Umiejętność czytania i dostosowywania algorytmów z innych języków programowania to bardzo dobra umiejętność.
ccxvii,

Odpowiedzi:


84

Po pierwsze, XNA również używa C #, więc jest to ten sam język programowania. I chociaż podstawowy interfejs API może mieć pewne różnice w stosunku do DirectX, nie ma to nic wspólnego ze skokami, więc te same samouczki lub odpowiedzi powinny mieć zastosowanie tutaj. Istnieje również wiele sposobów na wdrożenie tego, w zależności od wielu czynników. To, co opiszę poniżej, to tylko jedna z możliwości.

Podstawowe wymagania fizyki

Najpierw potrzebujesz podstawowych zmiennych fizycznych i obliczeń w swojej pętli aktualizacji. W szczególności potrzebujesz zdefiniować pozycję, prędkość i grawitację, a twoja pętla aktualizacji powinna robić coś mniej więcej podobnego (wykrywanie kolizji i reakcja pominięte dla uproszczenia):

float positionX, positionY;     // Position of the character
float velocityX, velocityY;     // Velocity of the character
float gravity = 0.5f;           // How strong is gravity

void Update(float time)
{
    positionX += velocityX * time;      // Apply horizontal velocity to X position
    positionY += velocityY * time;      // Apply vertical velocity to X position
    velocityY += gravity * time;        // Apply gravity to vertical velocity
}

Naprawiono skok wysokości

Teraz najłatwiejszym sposobem na wykonanie skoku, który zawsze ma tę samą wysokość, bez względu na to, jak długo naciskasz klawisz, jest po prostu zmiana prędkości pionowej raz. To sprawi, że postać zacznie się podnosić, a grawitacja automatycznie zajmie się jej sprowadzeniem:

void OnJumpKeyPressed()
{
    velocityY = -12.0f;   // Give a vertical boost to the players velocity to start jump
}

Ważne Nie chcesz mieć możliwości rozpoczęcia skoku, jeśli twoja postać nie znajduje się na ziemi, więc musisz dodać na to czek.

Skok o zmiennej wysokości

Ale gry takie jak Mario i Sonic mają zmienny skok, którego wysokość zależy od tego, jak długo naciskasz przycisk. W takim przypadku musisz obsłużyć zarówno naciśnięcie, jak i zwolnienie klawisza skoku. Możesz dodać coś takiego:

void OnJumpKeyReleased()
{
    if(velocityY < -6.0f)       // If character is still ascending in the jump
        velocityY = -6.0f;      // Limit the speed of ascent
}

Szczypanie wszystkie te wartości (czyli liczb, takich jak 0.5, -12.0flub -6.0f) w kodzie powyżej można zmienić atmosferę swojego skoku, jak wysoko skacze, ile pęd on zachować nawet po zwolnieniu przycisku skoku, jak szybko spada, etc .

Ważne Nie wywoływaj tych funkcji w każdej ramce. Zadzwoń do nich tylko raz, gdy klawisz zostanie naciśnięty lub zwolniony. W przeciwnym razie twoja postać poleci zamiast skakać.

Przykład roboczy

Właśnie stworzyłem szybki przykład technik opisanych powyżej, które możesz wypróbować w przeglądarce tutaj (naciśnij przycisk myszy, aby skoczyć, zwolnij go w połowie, aby kontrolować wysokość skoku). Jest w JS, ale jak wspomniałem wcześniej, język nie ma znaczenia w tym przypadku.

http://jsfiddle.net/LyM87/


11
Warto również podzielić się tym niesamowitym artykułem napisanym kilka dni temu z informacjami związanymi z tym tematem: Przewodnik po implementacji platformówek 2D . A także to: Sonic Jumping .
David Gouveia

2
W tym artykule opisano inny sposób wykonywania skoków zmiennych niż w odpowiedzi. Wzywa do tłumienia grawitacji lub dodawania impulsu, gdy przycisk jest przytrzymany. Zazwyczaj robię to, co mówi David w swojej odpowiedzi, ale czy są jakieś przemyślenia na temat metod tego artykułu?
Jeff

@Jeff To także przykuło moją uwagę i właśnie dlatego wspomniałem, że istnieje wiele sposobów na jego wdrożenie. Pierwszy artykuł opisuje dwa dodatkowe sposoby radzenia sobie z tym samym problemem, a sposób, który opisałem, oparty jest na drugim artykule. Nie wiem, jak się ze sobą porównują, chociaż każdy z nich jest dość łatwy do wdrożenia. Ostatecznie wybrałem tę metodę, ponieważ była łatwiejsza do wyjaśnienia i nie wymagała dodawania timera ani radzenia sobie z wieloma impulsami malejących wielkości.
David Gouveia,

Odpowiedź może się różnić w zależności od konkretnej gry i liczby animacji, które chcesz wykonać. Metroid korzysta ze stałej prędkości skoku: / opadania, ale maskuje go przy pomocy animacji wysokiej jakości, aby wyglądał gładko i „zakrzywiał się” w zenicie. Wiele innych platformówek używa skoków o zmiennej prędkości, które wymagają więcej pracy, aby działało dobrze.
Sean Middleditch

1
to było bardzo pomocne, 5 lat później :) i ta skrzypka jest bardzo fajna - powinienem nauczyć się JS!
Płynność

1

Jak w fizyce. Tylko w momencie, gdy naciskasz, jump keya postać jest na ziemi, zwiększ prędkość (zwana jest impulsem), ale cały czas spadaj pod wpływem grawitacji.

Jeśli nie chcesz, aby postać skakała za każdym razem, gdy uderza o ziemię - ponieważ trzymasz jump key- dodaj jump key is being pressedzmienną, którą wyczyścisz po jump keyzwolnieniu i ustawieniu po niej. Pseudo kod:

if jump being key pressed == false && jump key just pressed
   add y velocity 
   jump being key pressed = true

if jump key released
   jump being key pressed = false

decrease velocity by gravity
check for collisions // to not penetrate ground ...

Gdybym użył Twojej drogi:

if jump key not pressed
     jump height = 0            // imaginary height donkey would travel without gravity

if jump key pressed
     // going up
     if jump height < maximal height donkey might jump
         jump height += 5
         donkey.y    += 5        // 
     // going down
     else if jump height < 2 * maximal height donkey might jump
         jump height += 5
         donkey.y    -= 5

Jak donkey.yzmieni się twoja wyobraźnia. Prędkość powinna sprawić, że osioł o większej wadze będzie w powietrzu, aby wyglądał dobrze.

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.