Podstawowa fizyka gry: prędkość, grawitacja i odbicie
Grawitacja jest prędkością skumulowaną, a nie współrzędną skoku natychmiastowego; odbicie i tarcie są dodawane tą samą logiką przez delta time.
Piłka z sekcji 20.5 zmienia kierunek na przeciwną stronę, gdy uderza w ścianę – to już jest Podstawowa fizyka. Dodajmy do tego jeszcze dwa pomysły, które najczęściej są potrzebne w grach arcade: grawitacja i tarcie.
Jednostki
W formułach w tej sekcji znajdują się trzy różne wartości i łatwo je pomylić. Pozycja
(x, y) mierzone w pikselach.
Prędkość — w pikselach na sekundę (px/s): dokładnie w tych jednostkach, jak już wiesz z rozdziału
20.16, ustalają skorost_x/skorost_y
podczas ruchu przez delta time. Przyspieszenie — w pikselach na sekundę na sekundę, czyli
(px/s)/s, co zwykle zapisuje się jako px/s²: to, jak szybkość sama się zmienia każdą
sekundę. Grawitacja poniżej — właśnie przykład przyspieszenia.
Grawitacja jako akumulacja prędkości
Grawitacja — to nie „dodać do Y dużą liczbę raz”, a stałe, małe przyspieszenie, które w każdej klatce nieco zwiększa prędkość pionową. Sama pozycja zmienia się już za pomocą tej prędkości — z użyciem delta time z sekcji 20.16:
GRAVITACIYA = 900 # pikseli na sekundę na sekundę (akceleracja)
skorost_y += GRAVITACIYA * dt # prędkość wzrasta z każdą klatką
y += skorost_y * dt # pozycja zmienia się w wyniku skumulowanej prędkości
Właśnie dlatego w prawdziwym życiu (i w grach z uczciwą grawitacją) upadek zaczyna się powoli i przyspiesza — jest to bezpośredni skutek stałego narastania prędkości, a nie ustawienia „prędkość upadku” jedną liczbą.
odbicie z utratą energii
Prawdziwa piłka nie zawsze odbija się z tej samej wysokości – część energii jest tracona, gdy uderzenie. W kodzie jest to jeszcze jeden dodatkowy łańcuch znaków po odwróceniu prędkości:
KOEFF_OTSKOKA = 0.8 # piłka zachowuje 80% prędkości po odbiciu
if y + radius > VYSOTA:
y = VYSOTA - radius
skorost_y = -skorost_y * KOEFF_OTSKOKA
Brak mnożnika zaniku KOEFF_OTSKOKA piłka odbija się
do tej samej wysokości w nieskończoność — wraz z nią wysokość odbicia naturalnie maleje od
z każdym uderzeniem piłka prawie się zatrzymała. Taki czynnik tłumienia prędkości od uderzenia do
jest dobrze ugruntowaną techniką w grach i nazywa się restitution (współczynnik)
retracement, dosłownie „współczynnik odbicia” 1.0
odpowiada idealizowanemu bezstratnemu odbiciu przy pierwotnej prędkości, a dowolna wartość
między 0 a 1 — stopniowe odbicie z stopniową utratą energii.
Tarcie
Tarcie działa podobnie w przypadku ruchu poziomego – prędkość jest stopniowa zmniejsza się modulo (ale nie zmienia znaku), aż wychodzi do zera. Ważne jest, aby tarcie podobnie jak grawitacja, otrzymała przyspieszenie px/s² i była stosowana przez delta time — innymi słowy, Jeśli pomnożysz prędkość przez stały czynnik każdej klatki, hamowanie będzie zależało od FPS dokładnie taki sam jak ruch nieskorygowany w sekcji 20.16: na 120 FPS Mnożenie działa dwa razy częściej niż na 60 FPS, a obiekt zatrzyma się zauważalnie szybciej:
TRENIE = 300 # pikseli na sekundę w ciągu sekundy — przyspieszenie hamowania
if skorost_x > 0:
skorost_x = max(0.0, skorost_x - TRENIE * dt)
elif skorost_x < 0:
skorost_x = min(0.0, skorost_x + TRENIE * dt)
max()/min() nie jest tutaj podana
hamowanie, by „ślizgać się”