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.
Thử thách
Trung bìnhTạo hoạt ảnh cho con bọ theo đồng hồ.
- Xóa
timervà biến đếm. - Ở mỗi khung hình, đặt
frame_indexdựa trênpygame.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
5Va chạm chính xác đến từng pixel
Hình chữ nhật thật bất côngMặt nạSprite chính xác đến từng pixelVùng va chạm hình tròn3Lớp cho đối tượng trong trò chơi
Lớp đầu tiên của bạnPhương thứcSelf là đối tượngDanh sách đối tượngĐối tượng có hình ảnhDanh sách kẻ địchLớp con6Hoạt ảnh từ sprite sheet
Cắt sprite sheetBộ đếm khung hìnhTạo hoạt ảnh theo thời gianHiệu ứng nổ chỉ chạy một lầnTự luyện tập: Playground Pygame