Menu
CoddyTech

Bộ đếm khung hình

Thuộc phần Sprite và hình ảnh trong hành trình Pygame của Coddy. Bài học 27 trên 39.

Nhân vật đi ngang qua cửa sổ, nhưng chân không bao giờ cử động: nhân vật luôn hiển thị frames[0]. Nếu hiển thị khung hình khác sau mỗi lần, hình sẽ nhấp nháy 60 lần mỗi giây, quá nhanh để thấy chân cử động. Thay vào đó, hãy giữ mỗi hình trong vài khung hình, dùng bộ đếm:

timer += 1
if timer == 10:
    timer = 0
    frame_index = (frame_index + 1) % len(frames)

timer đếm số khung hình. Cứ sau 10 khung hình, bộ đếm quay lại 0 và frame_index chuyển sang hình tiếp theo. % len(frames) đưa chỉ số quay lại 0 sau hình cuối cùng, vì vậy chuyển động đi bộ lặp lại mãi, bất kể danh sách có bao nhiêu khung hình.

Vẽ frames[frame_index]. Ở tốc độ 60 khung hình mỗi giây, mỗi tư thế hiển thị trong một phần sáu giây: một dáng đi thong thả. Số nhỏ hơn 10 làm chân cử động nhanh hơn.

challenge icon

Thử thách

Trung bình

Khiến nhân vật bước đi.

  1. Trước vòng lặp, tạo frame_index = 0 và timer = 0.
  2. Mỗi khung hình, tăng timer thêm 1; khi đạt 10, đặt lại thành 0 rồi tăng frame_index, dùng % len(frames) để quay về đầu.
  3. Vẽ frames[frame_index] tại (x, 300).

Nhấn Chơi: chân nhân vật chuyển động khi đi. Sau đó nhấn Kiểm tra.

Tự làm thử

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Walk Cycle")
clock = pygame.time.Clock()

sheet = pygame.image.load("assets/sheets/platformer_characters.png").convert_alpha()
frames = []
for col in (0, 1):
    frame = sheet.subsurface((col * 24, 0, 24, 24))
    frames.append(pygame.transform.scale_by(frame, 3))
x = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    x += 2
    if x > 640:
        x = -72

    screen.fill((20, 22, 40))
    screen.blit(frames[0], (x, 300))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Tất cả bài học trong Sprite và hình ảnh

Tự luyện tập: Playground Pygame