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ổ.
Thử thách
Trung bìnhThêm phương thức update vào Explosion để phát hiệu ứng một lần.
- Cứ sau 5 khung hình, chuyển sang hình tiếp theo trong
explosion_frames. - 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()
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
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