Menu
CoddyTech

Explosiones

Parte de la sección Sprites e imágenes del Journey de Pygame de Coddy. Lección 34 de 36.

Un enemigo que desaparece en un fotograma da la sensación de que no ha pasado nada. Coloca una explosión donde estaba: la animación de un solo uso del capítulo 6, como un sprite en su propio grupo.

for enemy in hits:
    score += 10
    explosions.add(Explosion(enemy.rect.center))

Un sprite eliminado sigue teniendo su Rect, así que enemy.rect.center indica dónde recibió el impacto. La explosión reproduce explosion_1.png hasta explosion_4.png, 5 fotogramas cada una, y se elimina a sí misma.

Carga las cuatro imágenes en una lista, explosion_frames, antes del bucle. Actualiza explosions en cada fotograma y dibújalo al final, por encima de todo lo demás, para que la explosión cubra la nave y los láseres que se superponen con ella.

Los sonidos, una pantalla temblorosa y las chispas voladoras llegan en la sección 6, construidos sobre este mismo bucle.

challenge icon

Desafío

Intermedio
  1. Carga explosion_1.png hasta explosion_4.png en la lista explosion_frames.
  2. Escribe la clase Explosion de la lección Una explosión de un solo disparo, creada con un center.
  3. Crea explosions = pygame.sprite.Group(); añade una Explosion en el centro de cada enemigo destruido; actualízala en cada fotograma y dibújala después de la nave.

Pruébalo tú mismo

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()
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Sprites e imágenes

Practica por tu cuenta: Playground de Pygame