Menu
CoddyTech

Tạo hoạt ảnh theo thời gian

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

Bộ đếm khung hình gắn hoạt ảnh với tốc độ khung hình. Trên máy tính chỉ chạy được 30 khung hình mỗi giây, cánh con bọ đập chậm bằng một nửa. Thay vào đó, hãy gắn hoạt ảnh với thời gian.

pygame.time.get_ticks() là số mili giây tính từ lúc gọi pygame.init(). Chia số đó cho thời lượng mỗi hình cần hiển thị, bạn sẽ biết đã có bao nhiêu hình trôi qua; % biến kết quả thành một chỉ số:

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

Từ 0 đến 119 ms là hình 0, từ 120 đến 239 ms là hình 1, rồi đến 2, sau đó quay lại 0. Không cần bộ đếm để lưu và đặt lại: chỉ một dòng lệnh, được tính lại từ đầu ở mỗi khung hình. Nếu trò chơi chạy chậm lại, hoạt ảnh sẽ bỏ qua một hình thay vì chậm theo.

// thực hiện phép chia rồi bỏ phần dư: 250 // 120 bằng 2. Hàng thứ ba của tấm hình này có hình con bọ đang bay ở ba tư thế, tại các cột từ 6 đến 8, đã được cắt thành frames.

challenge icon

Thử thách

Trung bình

Tạo hoạt ảnh cho con bọ theo đồng hồ.

  1. Xóa timer và biến đếm.
  2. Ở mỗi khung hình, đặt frame_index dựa trên pygame.time.get_ticks() để mỗi hình trong ba hình hiển thị trong 120 mili giây, theo thứ tự.

Nhấn “Chơi”: con bọ vỗ cánh. 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("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()

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

Tự luyện tập: Playground Pygame