Animacja w czasie
Część sekcji Sprite’y i obrazy ścieżki Pygame w Coddy. Lekcja 27 z 36.
Licznik klatek wiąże animację z liczbą klatek na sekundę. Na komputerze, który obsługuje tylko 30 klatek na sekundę, skrzydła robaka trzepoczą z połową prędkości. Zamiast tego powiąż animację z czasem.
pygame.time.get_ticks() to liczba milisekund, które upłynęły od wywołania pygame.init(). Podziel tę wartość przez czas wyświetlania każdego obrazu, a otrzymasz liczbę wyświetlonych obrazów; % zamienia ją na indeks:
frame_index = pygame.time.get_ticks() // 120 % len(frames)Od 0 do 119 ms jest to obraz 0, od 120 do 239 ms obraz 1, potem 2, a następnie znowu 0. Nie trzeba przechowywać ani resetować licznika: jedna linijka, której wynik jest obliczany od nowa w każdej klatce. Jeśli gra zwolni, animacja pominie jeden obraz zamiast zwolnić razem z nią.
// dzieli i odrzuca resztę: 250 // 120 to 2. W trzecim wierszu tego arkusza znajduje się latający robak w trzech pozach, w kolumnach od 6 do 8; obrazy są już wycięte do frames.
Wyzwanie
Średni- Usuń
timeri licznik. - W każdej klatce ustaw
frame_indexna podstawiepygame.time.get_ticks(), aby każdy z trzech obrazów był wyświetlany przez 120 milisekund, po kolei.
Spróbuj swoich sił
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Flying Bug")
clock = pygame.time.Clock()
sheet = pygame.image.load("assets/sheets/platformer_characters.png").convert_alpha()
frames = []
for col in (6, 7, 8):
frame = sheet.subsurface((col * 24, 48, 24, 24))
frames.append(pygame.transform.scale_by(frame, 3))
frame_index = 0
timer = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
timer += 1
if timer == 10:
timer = 0
frame_index = (frame_index + 1) % len(frames)
screen.fill((20, 22, 40))
image = frames[frame_index]
screen.blit(image, image.get_rect(center=(320, 240)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Wszystkie lekcje w sekcji Sprite’y i obrazy
1Wczytywanie obrazów
Wczytaj obrazUmieść go za pomocą RectPrzesuń obrazPowiel tłoPrzezroczyste piksele2Obracaj, odbijaj, skaluj
Obracaj wokół środkaKieruj się w stronę lotuSkaluj obrazObracaj względem oryginału5Kolizje z dokładnością do piksela
Prostokąty wydają się niesprawiedliweMaskiSprite’y z dokładnością do pikselaKołowe hitboxy6Animacja z arkuszy sprite’ów
Przytnij arkusz sprite’ówLicznik klatekAnimacja w czasieJednorazowa eksplozjaPoćwicz samodzielnie: Edytor online Pygame