Boss, vagues d’ennemis et effets graphiques dans un Shoot ’em Up

Introduction

Dans ce dernier article, nous allons finaliser notre jeu en ajoutant un boss, en créant des vagues d’ennemis, et en### Article 3 : Ajouter un boss, des vagues d'ennemis et des effets spéciaux dans un jeu Shoot 'em Up

Introduction

Dans ce dernier article, nous allons ajouter un boss de fin de niveau, créer des vagues d’ennemis et intégrer des effets spéciaux comme des explosions et des animations pour rendre le jeu plus immersif et dynamique.

1. Créer des vagues d'ennemis

Au lieu d'avoir des ennemis qui apparaissent aléatoirement, nous allons introduire un système de vagues. Chaque vague comportera un nombre défini d’ennemis, et le joueur devra les éliminer pour passer à la suivante.

1.1. Système de vagues d'ennemis

Pour cela, nous devons compter combien d'ennemis sont actifs dans la scène. Lorsque tous les ennemis d'une vague sont détruits, une nouvelle vague est lancée avec des ennemis plus nombreux ou plus rapides.

def spawn_wave(n):
    for i in range(n):
        ennemi = Ennemi()
        all_sprites.add(ennemi)
        ennemis.add(ennemi)

# Exemple d'une vague de 5 ennemis
wave = 1
spawn_wave(5)

Lorsque le joueur élimine tous les ennemis d'une vague, nous lançons la suivante :

if len(ennemis) == 0:
    wave += 1
    spawn_wave(5 + wave)  # Augmente le nombre d'ennemis à chaque vague

2. Ajouter un boss

Après plusieurs vagues d'ennemis, il est temps de créer un boss. Le boss aura plus de points de vie, des attaques spéciales, et demandera une stratégie plus avancée pour être battu.

2.1. Création du boss

Le boss sera un sprite plus grand avec plusieurs points de vie, qui devra être touché plusieurs fois pour être détruit.

class Boss(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((100, 100))
        self.image.fill((255, 0, 255))  # Boss violet
        self.rect = self.image.get_rect()
        self.rect.center = (screen_width // 2, 100)
        self.vie = 20  # Points de vie

    def update(self):
        # Mouvement et autres comportements du boss
        pass

    def toucher(self):
        self.vie -= 1
        if self.vie <= 0:
            self.kill()

Lorsque le boss est touché par un projectile, ses points de vie diminuent. Si ses points de vie tombent à zéro, il est détruit.

2.2. Introduire le boss après plusieurs vagues

Après un certain nombre de vagues, vous pouvez introduire le boss pour augmenter la difficulté :

if wave == 5:  # Exemple : Boss à la 5e vague
    boss = Boss()
    all_sprites.add(boss)

3. Ajouter des effets spéciaux (explosions)

Pour rendre les combats plus visuellement engageants, nous allons ajouter des explosions lorsque des ennemis ou le boss sont détruits.

3.1. Créer un effet d'explosion

Une explosion sera une animation qui se joue brièvement lorsque l'ennemi ou le boss est détruit.

class Explosion(pygame.sprite.Sprite):
    def __init__(self, center):
        super().__init__()
        self.images = []
        for i in range(5):
            img = pygame.Surface((50, 50))  # Exemple d'image
            img.fill((255, 255, 0))  # Couleur jaune pour l'explosion
            self.images.append(img)
        self.index = 0
        self.image = self.images[self.index]
        self.rect = self.image.get_rect()
        self.rect.center = center
        self.timer = 0

    def update(self):
        self.timer += 1
        if self.timer % 10 == 0:  # Changer d'image toutes les 10 frames
            self.index += 1
            if self.index >= len(self.images):
                self.kill()
            else:
                self.image = self.images[self.index]

Lorsque l'ennemi ou le boss est détruit, créez une explosion à leur position.

# Lorsqu'un ennemi est détruit
explosion = Explosion(ennemi.rect.center)
all_sprites.add(explosion)

4. Effets visuels pour les tirs et autres améliorations graphiques

Pour améliorer les visuels, vous pouvez ajouter des effets lumineux aux projectiles ou utiliser des textures pour rendre les sprites plus intéressants. Par exemple, pour les projectiles, vous pouvez ajouter des effets lumineux ou des traînées derrière eux.


Code complet : Jeu Shoot 'em Up avec Boss, Vagues et Effets Spéciaux

import pygame
import random

# Classe Joueur
class Joueur(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((50, 40))
        self.image.fill((0, 255, 0))  # Vaisseau vert
        self.rect = self.image.get_rect()
        self.rect.center = (screen_width // 2, screen_height - 50)
        self.vitesse_x = 0

    def update(self):
        self.vitesse_x = 0
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.vitesse_x = -5
        if keys[pygame.K_RIGHT]:
            self.vitesse_x = 5
        self.rect.x += self.vitesse_x

        # Empêcher le vaisseau de sortir de l'écran
        if self.rect.right > screen_width:
            self.rect.right = screen_width
        if self.rect.left < 0:
            self.rect.left = 0

    def tirer(self):
        projectile = Projectile(self.rect.centerx, self.rect.top)
        all_sprites.add(projectile)
        projectiles.add(projectile)

# Classe Projectile
class Projectile(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((5, 10))
        self.image.fill((255, 0, 0))  # Projectile rouge
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)

    def update(self):
        self.rect.y -= 10
        if self.rect.bottom < 0:
            self.kill()  # Supprime le projectile quand il sort de l'écran

# Classe Ennemi
class Ennemi(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((40, 30))
        self.image.fill((255, 0, 0))  # Ennemi rouge
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0, screen_width - self.rect.width)
        self.rect.y = random.randint(-100, -40)
        self.vitesse_y = random.randint(2, 6)

    def update(self):
        self.rect.y += self.vitesse_y
        if self.rect.top > screen_height:
            self.rect.x = random.randint(0, screen_width - self.rect.width)
            self.rect.y = random.randint(-100, -40)
            self.vitesse_y = random.randint(2, 6)

# Classe Boss
class Boss(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((100, 100))
        self.image.fill((255, 0, 255))  # Boss violet
        self.rect = self.image.get_rect()
        self.rect.center = (screen_width // 2, 100)
        self.vie = 20  # Points de vie

    def update(self):
        # Mouvement et autres comportements du boss
        pass

    def toucher(self):
        self.vie -= 1
        if self.vie <= 0:
            self.kill()

# Classe Explosion
class Explosion(pygame.sprite.Sprite):
    def __init__(self, center):
        super().__init__()
        self.images = []
        for i in range(5):
            img = pygame.Surface((50, 50))  # Exemple d'image
            img.fill((255, 255, 0))  # Couleur jaune pour l'explosion
            self.images.append(img)
        self.index = 0
        self.image = self.images[self.index]
        self.rect = self.image.get_rect()
        self.rect.center = center
        self.timer = 0

    def update(self):
        self.timer += 1
        if self.timer % 10 == 0:  # Changer d'image toutes les 10 frames
            self.index += 1
            if self.index >= len(self.images):
                self.kill()
            else:
                self.image = self.images[self.index]

# Initialisation Pygame
pygame.init()
screen_width, screen_height = 800, 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Shoot 'em Up")
clock = pygame.time.Clock()

# Groupes de sprites
all_sprites = pygame.sprite.Group()
projectiles = pygame.sprite.Group()
ennemis = pygame.sprite.Group()

# Créer le joueur
joueur = Joueur()
all_sprites.add(joueur)

# Ajouter des vagues d'ennemis
def spawn_wave(n):
    for i in range(n):
        ennemi = Ennemi()
        all_sprites.add(ennemi)
        ennemis.add(ennemi)

# Variables pour les vagues
wave = 1
spawn_wave(5)
boss_spawned = False
score = 0

# Boucle principale
running = True
while running:
    clock.tick(60)

    # Gestion des événements
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                joueur.tirer()

    # Mettre à jour les sprites
    all_sprites.update()

    # Détecter les collisions entre projectiles et ennemis
    collisions = pygame.sprite.groupcollide(projectiles, ennemis, True, True)
    for collision in collisions:
        score += 10
        explosion = Explosion(collision.rect.center)
        all_sprites.add(explosion)

    # Si tous les ennemis sont éliminés, passer à la vague suivante
    if len(ennemis) == 0 and not boss_spawned:
        if wave < 5:
            wave += 1
            spawn_wave(5 + wave)  # Plus d'ennemis à chaque vague
        else:
            # Apparaître le boss à la 5e vague
            boss = Boss()
            all_sprites.add(boss)
            boss_spawned = True

    # Afficher les éléments
    screen.fill((0, 0, 0))
    all_sprites.draw(screen)

    pygame.display.flip()

pygame.quit()


Conclusion

Dans cet article, nous avons ajouté un boss, des vagues d’ennemis, et des effets spéciaux comme des explosions pour rendre le jeu plus dynamique. Vous avez maintenant les bases pour créer un shoot 'em up complet et améliorer son apparence visuelle. Vous pouvez étendre ce projet en ajoutant plus de variétés d'ennemis, des niveaux, et des attaques spéciales pour le boss.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *