Rozdział 20 · Tworzenie gier z Pygame

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

Trzy prawdziwe okna obok siebie: pomarańczowa kula spada coraz szybciej od góry do dołu
Prawdziwe okno: trzy momenty tego samego upadku – odległość między pozycjami rośnie, ponieważ prędkość się kumuluje.

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:

otskok_s_zatuhaniem.py
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.py
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ę”

To nie jest cały symulator fizyki
Prawdziwe silniki fizyczne (Box2D i podobne) rozwiązują znacznie bardziej ogólne zadania — obrót, masę, tarcie między dowolnymi kształtami, kolizje wielu ciał naraz. Wzory z tego działu — uproszczony, ale całkowicie działający model właśnie dla gier arcade, takich jak te, które tworzysz w tym rozdziale, a ich zrozumienie — dobra baza do przejścia do prawdziwego silnika fizycznego później, jeśli zajdzie taka potrzeba.
Praktyka: Grawitacja i rozpad odbijają się
Zeskanowanie bezpośrednio w przeglądarce – nie wymaga instalacji Pygame
Otwórz praktykę →