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.