Menu
CoddyTech

Animare con il tempo

Fa parte della sezione Sprite e immagini del percorso Pygame di Coddy. Lezione 27 di 36.

Un contatore dei fotogrammi lega l’animazione alla frequenza dei fotogrammi. Su un computer che gestisce solo 30 fotogrammi al secondo, le ali dell’insetto sbattono a metà velocità. Legala invece al tempo.

pygame.time.get_ticks() è il numero di millisecondi trascorsi da pygame.init(). Dividi per quanto dovrebbe durare ogni immagine e ottieni quante immagini sono passate; % lo trasforma in un indice:

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

Da 0 a 119 ms si vede l’immagine 0, da 120 a 239 ms l’immagine 1, poi la 2 e di nuovo la 0. Non c’è nessun contatore da mantenere e azzerare: una riga, ricalcolata da zero a ogni fotogramma. Se il gioco rallenta, l’animazione salta un’immagine invece di rallentare insieme al gioco.

// divide e scarta il resto: 250 // 120 è 2. La terza riga di questo foglio contiene un insetto volante in tre pose, nelle colonne dalla 6 all’8, già ritagliate in frames.

challenge icon

Sfida

Medio
  1. Rimuovi timer e il contatore.
  2. A ogni fotogramma, imposta frame_index usando pygame.time.get_ticks(), in modo che ciascuna delle tre immagini venga mostrata per 120 millisecondi, in ordine.

Provalo tu

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

Tutte le lezioni di Sprite e immagini

Esercitati da solo: Playground Pygame