Menu
CoddyTech

Animer avec le temps

Fait partie de la section Sprites et images du Journey Pygame de Coddy. Leçon 27 sur 36.

Un compteur d’images lie l’animation à la fréquence d’images. Sur un ordinateur qui ne gère que 30 images par seconde, les ailes du scarabée battent à la moitié de leur vitesse. Faites plutôt dépendre l’animation du temps.

pygame.time.get_ticks() correspond au nombre de millisecondes écoulées depuis pygame.init(). Divisez cette valeur par la durée d’affichage de chaque image pour obtenir le nombre d’images écoulées ; % transforme ce nombre en indice :

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

De 0 à 119 ms, il s’agit de l’image 0 ; de 120 à 239 ms, de l’image 1, puis de l’image 2, et enfin à nouveau de l’image 0. Pas de compteur à conserver et à réinitialiser : une seule ligne, recalculée à chaque image. Si le jeu ralentit, l’animation saute une image au lieu de ralentir avec lui.

// effectue une division et supprime le reste : 250 // 120 vaut 2. La troisième rangée de cette feuille contient un scarabée en vol dans trois poses, dans les colonnes 6 à 8, déjà découpées dans frames.

challenge icon

Défi

Moyen
  1. Supprimez timer et le compteur.
  2. À chaque image, définissez frame_index à partir de pygame.time.get_ticks() afin que chacune des trois images s’affiche pendant 120 millisecondes, dans l’ordre.

Essayez vous-même

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

Toutes les leçons de Sprites et images

Entraînez-vous par vous-même : Playground Pygame