Tu vas créer un jeu Zelda interactif !

9. ÉTAPE 8 : Tirer des projectiles (Boules de feu / Flèches)


Objectif

L'élève apprend à gérer une deuxième liste dynamique (les projectiles) qui ont leur propre mouvement et une durée de vie limitée.

Question motivante

"Et si on pouvait éliminer les ennemis de loin ? Comment créer un objet qui 'apparaît' quand on appuie sur une touche et qui avance tout seul ?"

Concepts clés à maîtriser

  • Initialisation dynamique : Créer un nouveau dictionnaire au moment du clic ou de la touche.

  • Gestion des listes (Nettoyage) : Supprimer le projectile quand il sort de l'écran pour ne pas ralentir l'ordinateur.


1. Préparation (Avant la boucle)

On crée une liste vide pour stocker nos projectiles.

Python
# ===== PROJECTILES =====
projectiles = []
projectile_speed = 7

2. Création du projectile (Événement clavier)

On peut utiliser la touche X ou ENTRÉE pour tirer.

Python
    # Dans la gestion des événements (ou après le mouvement)
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_x:
            # On crée un dictionnaire pour le nouveau projectile
            new_bullet = {
                'x': player['x'] + player['width'] // 2,
                'y': player['y'],
                'width': 10,
                'height': 10,
                'vx': 0,
                'vy': -projectile_speed # Tire vers le haut par défaut
            }
            projectiles.append(new_bullet)

3. Logique et Collision (Boucle principale)

Il faut faire avancer les projectiles et vérifier s'ils touchent un ennemi.

Python
    # Déplacement des projectiles
    for p in projectiles[:]:
        p['y'] += p['vy']
        
        # Supprimer si sort de l'écran
        if p['y'] < 0:
            projectiles.remove(p)
            continue
            
        # Collision Projectile <-> Ennemi
        for enemy in enemies[:]:
            if (p['x'] < enemy['x'] + enemy['width'] and
                p['x'] + p['width'] > enemy['x'] and
                p['y'] < enemy['y'] + enemy['height'] and
                p['y'] + p['height'] > enemy['y']):
                
                if enemy in enemies: enemies.remove(enemy)
                if p in projectiles: projectiles.remove(p)
                print("Cible détruite !")

4. Affichage

Python
    # Dessiner les projectiles
    for p in projectiles:
        pygame.draw.circle(screen, (255, 255, 0), (p['x'], p['y']), 5)

Le Défi "Sniper" :

"Modifiez le code pour que le projectile aille dans la direction où le personnage se déplace (si je vais à droite, le projectile part à droite) !"

Indice : Il faudra stocker la dernière direction du joueur dans le dictionnaire player.