Skoki, Grawitacja? O.o

0

Witam, jestem newbie jeśli chodzi o allegro, i właśnie zaczynam pisać moją pierwszą platformówkę.
Niestety zatrzymałem się na jeden z podstawowych rzeczy - skoku.
Chciałbym się dowiedzieć co zrobić aby:

  1. po wciśnięci strzałki do góry ludzik podskakiwał na pewną odległość, a następnie opadł(tak aby w powietrzu nie dało się skoczyć jeszcze raz)
  2. Skok był płynny oraz realistyczny, tzn. dość gwałtowny przy wybiciu, oraz stopniowo przyśpieszający przy opadaniu.
  3. Była grawitacja - czyli np. jeśli spadnę z jakiegoś obiektu ludzik powinien opadać, u mnie opiera się jedynie na "ludzik_y++;"
    Nie wygląda to za fajnie.

Będę bardzo wdzięczny za wszelką pomoc ;]

1

Tu się kłaniają podstawy fizyki ;) Zakładając, że masz główną pętlę gry, w której renderujesz klatki obrazu wystarczy, że w niej będziesz liczył jaki czas minął od ostatniej klatki do aktualnej. Teraz podczas skoku(ma zadziałać tylko wtedy jeżeli ludzik dotyka podłoża - wykrywanie kolizji) ustawiasz wektor prędkości na jakąś tam wartość zwrócony do góry. Na podstawie tego wektora i czasu liczysz przesunięcie ludzika i dodatkowo zmieniasz wektor na podstawie czasu i wektora przyspieszenia(jakie sobie ustalisz) skierowanego ku ziemi. Wartości przyspieszenia i początkowej prędkości skoku ustalasz sobie jak Ci pasuje(doświadczalnie) - wtedy będzie to wyglądać najbardziej naturalnie.

1

skoro piszesz grę powinieneś spotkać się z terminem "pętla czasu rzeczywistego", tam wykonujesz główne operacje (rysowanie, odświeżanie, kolizje, zdarzenia itd.) no i liczysz wyżej wspomnianą deltę czasu. Poza tym, aby postać nie wykonywała podwójnego skoku musisz mieć najlepiej jakąś funkcję, którą określała by czy postać znajduje się w tej chwili w ruchu. Aby wszystko wyglądało płynnie (chodzenie, skok itd.) najlepiej narysować sobie postać w różnych pozycjach i potem podczas wykonywania ruchu wklejać kolejne klatki z tzw. albumu. Wzory stosujesz takie jak w podstawach fizyki z tą różnicą, że czasem dobrze jest wymnożyć sobie całość przez jakiś współczynnik, który dobierzesz doświadczalnie w zależności od tego jak ci się będzie podobać. Musisz pamiętać, aby przy obliczeniach uwzględniać upływ czasu wtedy to działa płynnie i bezproblemowo.

0

// p przed nazwa zmiennej oznacza pochodną, pp drugą pochodną:
ppy = 9.8; // przyspieszenie, mozesz zmienic na troche mniejsze albo zrobic ze postac spada ze stala predkoscia (wtedy: py = 9.8, a z ppy w ogóle rezygnujesz)
py += ppydt; // ewentualnie mozesz zrobic ograniczenie na wartosc maksymalna
y += py
dt; // sprawdzasz pozniej czy nie nastapila kolizja np z sufitem

0

Okey, jeśli chodzi o pojedynczy skok to zrobiłem coś takiego:

if(skoki > 0)
    {
             ludek_y=ludek_y-2;
             skoki --;
             }

Oraz program sprawdza również przed wciśnięciem strzałki do góry czy obiekt stoi na kolizji.

Teraz chcę się dowiedzieć co zrobić aby ludzik szybciej się wybijał, od czysto technicznej strony, wiem że istnieje takie coś jak timmer, lecz ja umiem zrobić tylko taki co działa na cały proces programu w pętli, a ja chciałbym tylko żeby jedna czynność miała inną prędkość.

@Edit: wiem że można zrobić np ludek_y = ludek_y + 2 (zamiast 1) ale wtedy nie wygląda to płynnie, oraz między 1 a 2 pixeli jest sporo różnicy, więcej niż potrzebuję.

0

tak jak Ci napisałem w poprzednim poście tylko po prostu w momencie skoku dodajesz/odejmujesz do prędkości (py) jakąś wartość, reszta się sama obliczy (kolizje z podłogą musisz sam wykryć, wtedy również powinieneś ustalić że przyspieszenia nie ma, bo siła grawitacji jest równoważona przez siłę działającą od podłoża)

0

Ja to robię tak:
Stwórz sobie strukturę (bądź klasę) człowieka, zamieść w niej, wzrost, masę, środek masy, prędkość i współrzędne x, y (jeżeli 3D to jeszcze z)
Potem obliczasz w zależności od prędkości wysokość na jakiej się znajduje (pomijamy opór powietrza, dlatego x (i byćmoże z) zmienia się stale z tą samą prędkością, natomiast y według wzoru
y(t) = (v0 * sinA) * t - g * t * t / 2
gdzie t jest czasem
A kątem od poziomu przy wyskoku
v0 prędkością początkową
g - przyspieszeniem ziemskim który wynosi ok. (tak jak napisał krwq) 9.8 m/s^2
Wszystkie wartości muszą być w radianach, metrach i w sekunach inaczej będzie błąd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1