Menu
CoddyTech

Menganimasikan dengan Waktu

Termasuk bagian Sprite dan Gambar dalam perjalanan Pygame di Coddy. Pelajaran 27 dari 36.

Penghitung frame mengaitkan animasi dengan laju frame. Pada komputer yang hanya mampu menangani 30 frame per detik, sayap serangga mengepak dengan kecepatan setengahnya. Kaitkan animasi dengan waktu.

pygame.time.get_ticks() adalah jumlah milidetik sejak pygame.init(). Bagi dengan durasi setiap gambar, dan kamu akan mendapatkan jumlah gambar yang telah berlalu; % mengubahnya menjadi indeks:

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

Dari 0 hingga 119 ms, hasilnya adalah gambar 0, dari 120 hingga 239 ms gambar 1, lalu 2, kemudian kembali ke 0. Kamu tidak perlu menyimpan dan mengatur ulang penghitung: satu baris, dihitung ulang setiap frame. Jika game melambat, animasi akan melewati satu gambar alih-alih ikut melambat.

// membagi lalu membuang sisanya: 250 // 120 hasilnya 2. Baris ketiga sprite sheet ini menampilkan serangga terbang dalam tiga pose, pada kolom 6 hingga 8, yang sudah dipotong menjadi frames.

challenge icon

Tantangan

Sedang
  1. Hapus timer dan penghitungnya.
  2. Pada setiap frame, atur frame_index dari pygame.time.get_ticks() agar setiap dari tiga gambar ditampilkan selama 120 milidetik, secara berurutan.

Coba sendiri

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

Semua pelajaran di Sprite dan Gambar

Latihan sendiri: Playground Pygame