Menu
CoddyTech

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.

challenge icon

Thử thách

Trung bình

Thổi bay từng kẻ địch trúng tia laser.

  1. Tải các tệp explosion_1.png đến explosion_4.png vào danh sách explosion_frames.
  2. Viết lớp Explosion trong bài học Vụ nổ một lần, tạo lớp này bằng center.
  3. 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

Tự luyện tập: Playground Pygame