Menu
CoddyTech

Hiệu ứng nổ chỉ chạy một lần

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

Một số ảnh động chỉ chạy một lần rồi kết thúc: vụ nổ lần lượt hiển thị explosion_1.png đến explosion_4.png rồi biến mất. Với tư cách là một sprite, nó có thể tự đếm và xóa chính nó khi hết ảnh:

def update(self):
    self.timer += 1
    if self.timer == 5:
        self.timer = 0
        self.index += 1
        if self.index == len(explosion_frames):
            self.kill()
        else:
            self.image = explosion_frames[self.index]

Mỗi vụ nổ có timer và index riêng, vì vậy mười vụ nổ bắt đầu ở những thời điểm khác nhau đều chạy từ đầu. Chỉ cần thay đổi self.image: nhóm sẽ vẽ bất kỳ hình ảnh nào mà sprite đang giữ.

Kiểm tra xem đã đến cuối chưa trước khi đọc danh sách: explosion_frames[4] không tồn tại, và khi hình ảnh cuối cùng đã hiển thị đủ 5 khung hình, kill() sẽ xóa vụ nổ khỏi nhóm. Nhấp vào bất kỳ đâu trong cửa sổ để kích hoạt một vụ nổ.

challenge icon

Thử thách

Trung bình

Thêm phương thức update vào Explosion để phát hiệu ứng một lần.

  1. Cứ sau 5 khung hình, chuyển sang hình tiếp theo trong explosion_frames.
  2. Sau khi hình thứ tư hiển thị được 5 khung hình, gọi self.kill().

Nhấn Chơi rồi nhấp chuột: hiệu ứng nổ sẽ phát rồi biến mất. 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("Explosions")
clock = pygame.time.Clock()

explosion_frames = []
for n in range(1, 5):
    explosion_frames.append(pygame.image.load(f"assets/images/explosion_{n}.png").convert_alpha())


class Explosion(pygame.sprite.Sprite):
    def __init__(self, center):
        super().__init__()
        self.index = 0
        self.timer = 0
        self.image = explosion_frames[0]
        self.rect = self.image.get_rect(center=center)


explosions = pygame.sprite.Group()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            explosions.add(Explosion(event.pos))

    explosions.update()

    screen.fill((20, 22, 40))
    explosions.draw(screen)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

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

Tự luyện tập: Playground Pygame