Menu
CoddyTech

Explosions

Fait partie de la section Sprites et images du Journey Pygame de Coddy. Leçon 34 sur 36.

Un ennemi qui disparaît en une seule image donne l’impression qu’il ne s’est rien passé. Place une explosion là où il se trouvait : l’animation ponctuelle du chapitre 6, sous forme de sprite dans son propre groupe.

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

Un sprite éliminé possède toujours son Rect ; enemy.rect.center indique donc l’endroit où il a été touché. L’explosion joue explosion_1.png à explosion_4.png, 5 images chacune, puis se détruit.

Charge les quatre images dans une liste, explosion_frames, avant la boucle. Mets à jour explosions à chaque image et dessine-le en dernier, par-dessus tout le reste, afin que l’explosion recouvre le vaisseau et les lasers qu’elle chevauche.

Les sons, les secousses de l’écran et les étincelles qui fusent arrivent à la section 6, construite sur cette même boucle.

challenge icon

Défi

Moyen
  1. Chargez explosion_1.png à explosion_4.png dans la liste explosion_frames.
  2. Écrivez la classe Explosion de la leçon « Une explosion en un seul coup », créée à partir d’un center.
  3. Créez explosions = pygame.sprite.Group() ; ajoutez une explosion au centre de chaque ennemi détruit ; mettez-la à jour à chaque image et dessinez-la après le vaisseau.

Essayez vous-même

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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Sprites et images

Entraînez-vous par vous-même : Playground Pygame