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():
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:
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.
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.