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.
# ===== PROJECTILES =====
projectiles = []
projectile_speed = 7
2. Création du projectile (Événement clavier)
On peut utiliser la touche X ou ENTRÉE pour tirer.
# 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.
# 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
# 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.