Vụ nổ
Thuộc phần Sprite và hình ảnh trong hành trình Pygame của Coddy. Bài học 35 trên 39.
Kẻ địch biến mất chỉ trong một khung hình khiến bạn có cảm giác chẳng có gì xảy ra. Hãy đặt một vụ nổ ở vị trí nó biến mất: hoạt ảnh phát một lần từ chương 6, dưới dạng sprite trong group riêng.
for enemy in hits:
score += 10
explosions.add(Explosion(enemy.rect.center))Sprite bị tiêu diệt vẫn còn Rect, nên enemy.rect.center là vị trí nó bị bắn trúng. Vụ nổ chạy lần lượt các ảnh từ explosion_1.png đến explosion_4.png, mỗi ảnh 5 khung hình, rồi tự tiêu diệt.
Trước vòng lặp, hãy tải bốn ảnh vào danh sách explosion_frames. Cập nhật explosions mỗi khung hình và vẽ nó sau cùng, phủ lên mọi thứ khác, để vụ nổ che khuất con tàu và các tia laser mà nó chồng lên.
Âm thanh, hiệu ứng rung màn hình và tia lửa bay sẽ xuất hiện ở phần 6, dựa trên chính vòng lặp này.
Thử thách
Trung bìnhThổi bay từng kẻ địch trúng tia laser.
- Tải các tệp
explosion_1.pngđếnexplosion_4.pngvào danh sáchexplosion_frames. - Viết lớp
Explosiontrong bài học Vụ nổ một lần, tạo lớp này bằngcenter. - Tạo
explosions = pygame.sprite.Group(); thêm một vụ nổ tại vị trí trung tâm của mỗi kẻ địch bị tiêu diệt; cập nhật và vẽ các vụ nổ sau tàu.
Nhấn Chơi rồi bắn: mỗi lần trúng mục tiêu sẽ tạo ra một vụ nổ. Sau đó, nhấn Kiểm tra.
Tự làm thử
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Star Patrol")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)
ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.png").convert_alpha()
red_image = pygame.image.load("assets/images/enemy_red.png").convert_alpha()
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = ship_image
self.rect = self.image.get_rect(midbottom=(320, 470))
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
self.rect.x -= 6
if keys[pygame.K_RIGHT]:
self.rect.x += 6
self.rect.clamp_ip(screen.get_rect())
class Laser(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = laser_image
self.rect = self.image.get_rect(midbottom=(x, y))
self.mask = pygame.mask.from_surface(self.image)
def update(self):
self.rect.y -= 10
if self.rect.bottom < 0:
self.kill()
class Enemy(pygame.sprite.Sprite):
def __init__(self, image, x, y, speed):
super().__init__()
self.image = image
self.rect = self.image.get_rect(center=(x, y))
self.mask = pygame.mask.from_surface(self.image)
self.speed = speed
def update(self):
self.rect.y += self.speed
def spawn_wave(image, count, speed):
for i in range(count):
x = random.randint(40, 600)
enemies.add(Enemy(image, x, -40 - i * 120, speed))
player = Player()
lasers = pygame.sprite.Group()
enemies = pygame.sprite.Group()
last_shot = 0
score = 0
spawn_wave(red_image, 6, 2)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
player.update()
keys = pygame.key.get_pressed()
now = pygame.time.get_ticks()
if keys[pygame.K_SPACE] and now - last_shot >= 250:
lasers.add(Laser(player.rect.centerx, player.rect.top))
last_shot = now
lasers.update()
enemies.update()
for enemy in enemies:
if enemy.rect.top > 480:
enemy.kill()
hits = pygame.sprite.groupcollide(enemies, lasers, True, True, pygame.sprite.collide_mask)
for enemy in hits:
score += 10
screen.fill((12, 14, 30))
enemies.draw(screen)
lasers.draw(screen)
screen.blit(player.image, player.rect)
score_text = font.render(f"Score: {score}", True, (240, 240, 240))
screen.blit(score_text, (10, 10))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Tất cả bài học trong Sprite và hình ảnh
7Tuần tra giữa các vì sao
Tàu tuần traBắn laser5Va 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