Rozdział 20 · Tworzenie gier z Pygame

Animacja sprite'ów: Klatki i lista sprite'ów

Animacja — to szybka zmiana klatek jednego obrazu według własnego zegara, niezgodnego z częstotliwością klatek gry.

Do tej pory postacie były statycznymi figurami lub jednym nieruchomym obrazkiem. Animacja — to szybka zmiana kilku klatek rysunku, tworząca iluzję ruchu, — ta sama zasada, co w kreskówce lub flipbooku.

Lista sprite'ów

Lista sprite'ów (sprite sheet) to pojedynczy obraz, w którym klatki animacji są ułożone w rzędzie. Aby pokazać pożądaną klatkę, po zdjęciu wycina się prostokątny obszar subsurface():

kadr_iz_lista.py
SHIRINA_KADRA, VYSOTA_KADRA = 32, 32
sprajt_list = pygame.image.load("assets/hodba.png").convert_alpha()

def poluchit_kadr(nomer):
    x = nomer * SHIRINA_KADRA
    return sprajt_list.subsurface((x, 0, SHIRINA_KADRA, VYSOTA_KADRA))

Timer animacji

Klatki animacji nie powinny zmieniać każdej klatki w pętli gry – jest za szybka (przy 60 FPS jest to 60 zmian wzoru na sekundę). Zamiast tego czas gromadzi się w urządzeniu pamięci masowej (baterii), oraz Klatka animacji przełącza się na własny, wolniejszy timer:

tajmer_animacii.py
INTERVAL_KADRA = 0.12   # sekund na klatkę animacji
tekushij_kadr = 0
vremya_animacii = 0.0

vremya_animacii += dt
while vremya_animacii >= INTERVAL_KADRA:
    vremya_animacii -= INTERVAL_KADRA
    tekushij_kadr = (tekushij_kadr + 1) % KOLICHESTVO_KADROV

% KOLICHESTVO_KADROV (pozostałość podziału, rozdział 4) Pętla licznika klatek: Po ostatniej klatce animacja zaczyna się od zera. Ważne jest właśnie to, co jest tutaj ważne while, nie if: jeśli jedna klatka gry trwa dłużej niż kilka odstępów naraz z powodu FPS drawdownu animacje, while przełączy klatkę animacji potrzebną liczbę razy z rzędu i zapisze resztę czasu w vremya_animacii na następny przejście. if zamiast tego przesuwa animację tylko o jeden krok do przodu i po cichu stracił dodatkowy zgromadzony czas.

Cztery prawdziwe okna obok siebie: noga niebieskiej postaci przesuwa się w prawo z klatki na ramę, mierząc stopień
Rzeczywiste okno: cztery klatki tej samej prostej animacji chodzenia, ręcznie narysowane dla tego przykładu — ta sama zasada co w prawdziwym arkuszu sprite'ów.
Aktualizacja po renderowaniu – animacja opóźnia się o klatkę
Jeśli kod się zmienia tekushij_kadr, warto po rysowanie bieżącej klatki, gracz na ekranie zawsze widzi poprzedni stan animacji, a nie tylko właśnie obliczony. Kolejność Update → Render z rozdziału 20.14 istnieje właśnie po to, aby uniknąć takiej jednoklatkowej niesynchronizacji.
Praktyka: lista sprajtów i timer animacji
Pygame otwiera natywne okno Python – uruchomione lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →