Menu
CoddyTech

Mit Zeit animieren

Teil des Abschnitts Sprites und Bilder der Pygame-Journey von Coddy. Lektion 27 von 36.

Ein Bildzähler koppelt die Animation an die Bildrate. Auf einem Computer, der nur 30 Bilder pro Sekunde schafft, flattern die Flügel des Käfers halb so schnell. Kopple sie stattdessen an die Zeit.

pygame.time.get_ticks() gibt die Anzahl der Millisekunden seit pygame.init() an. Teile sie durch die Dauer, die jedes Bild angezeigt werden soll, und du erhältst, wie viele Bilder vergangen sind; % macht daraus einen Index:

frame_index = pygame.time.get_ticks() // 120 % len(frames)

Von 0 bis 119 ms ist das Bild 0, von 120 bis 239 ms Bild 1, dann 2 und dann wieder 0. Kein Zähler, den du speichern und zurücksetzen musst: eine Zeile, die für jedes Bild neu berechnet wird. Wenn das Spiel langsamer wird, überspringt die Animation ein Bild, statt ebenfalls langsamer zu werden.

// dividiert und lässt den Rest weg: 250 // 120 ergibt 2. Die dritte Zeile dieses Spritesheets zeigt einen fliegenden Käfer in drei Posen, in den Spalten 6 bis 8, bereits in frames zugeschnitten.

challenge icon

Aufgabe

Mittel
  1. Entferne timer und den Zähler.
  2. Setze in jedem Frame frame_index anhand von pygame.time.get_ticks(), sodass jedes der drei Bilder der Reihe nach 120 Millisekunden lang angezeigt wird.

Probier es selbst

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

Alle Lektionen in Sprites und Bilder

Übe selbstständig: Pygame-Playground