Menu
CoddyTech

Anime com o tempo

Parte da seção Sprites e imagens do Journey de Pygame da Coddy. Lição 27 de 36.

Um contador de quadros vincula a animação à taxa de quadros. Em um computador que só consegue renderizar 30 quadros por segundo, as asas do inseto batem na metade da velocidade. Vincule-a ao tempo em vez disso.

pygame.time.get_ticks() é o número de milissegundos desde pygame.init(). Divida pelo tempo que cada imagem deve durar e você terá quantas imagens já passaram; % transforma isso em um índice:

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

De 0 a 119 ms, essa é a imagem 0; de 120 a 239 ms, a imagem 1; depois, 2 e, então, 0 novamente. Não há contador para manter e reiniciar: uma linha, calculada do zero a cada quadro. Se o jogo ficar mais lento, a animação pula uma imagem em vez de ficar mais lenta junto.

// divide e descarta o resto: 250 // 120 é 2. A terceira linha desta folha contém um inseto voando em três poses, nas colunas 6 a 8, já recortadas em frames.

challenge icon

Desafio

Médio
  1. Remova timer e o contador.
  2. A cada quadro, defina frame_index com base em pygame.time.get_ticks() para que cada uma das três imagens seja exibida por 120 milissegundos, em ordem.

Experimente você mesmo

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

Todas as lições de Sprites e imagens

Pratique por conta própria: Playground de Pygame