Dojo Defender : Session 2
Ton vaisseau a maintenant une arme. Les ennemis arrivent. Abats-les avant qu’ils atteignent le fond. Tous les 10 ennemis, une nouvelle vague — et ça devient de plus en plus difficile.
Ce que tu vas apprendre aujourd’hui
- Tirer avec la barre d’espace et un cooldown
- Des listes pour les balles et les ennemis
- La collision entre les balles et les ennemis
- Des vagues qui deviennent de plus en plus difficiles
- Des ennemis qui font des mouvements sinusoïdaux
Étape 0 : Ouvre le starter
- Ouvre Thonny.
- Télécharge le starter Dojo Defender d’aujourd’hui, décompresse le ZIP et ouvre
main.py. - Tu n’étais pas là la dernière fois ? Télécharge la solution de la session 1 et commence avec ça.
- Clique sur Run. Tu vois le même jeu que la dernière fois : vaisseau, astéroïdes, explosions.
- Des problèmes ? Va voir Installer Thonny.
Étape 1 : Tirer avec ESPACE
Ton vaisseau a un canon laser. Ajoute une liste pour les balles en haut :
bullets = []Utilise on_key_down — elle n’est appelée qu’une seule fois quand tu appuies sur une touche (contrairement à update qui se répète) :
def on_key_down(key):
if key == keys.SPACE:
bullet = Actor('bullet')
bullet.x = ship.x
bullet.y = ship.y - 20
bullets.append(bullet)Fais monter les balles dans update() et supprime-les quand elles sortent de l’écran :
for bullet in bullets[:]:
bullet.y -= 8
if bullet.y < -10:
bullets.remove(bullet)N’oublie pas de dessiner les balles dans draw() :
for bullet in bullets:
bullet.draw()Étape 2 : ✅ Basic : cooldown de tir
Sans cooldown, tu tires des dizaines de balles par seconde. Ajoute un timer :
shoot_cooldown = 0Dans update() :
if shoot_cooldown > 0:
shoot_cooldown -= 1Adapte on_key_down pour ne pouvoir tirer que quand le cooldown est à 0 :
def on_key_down(key):
global shoot_cooldown
if key == keys.SPACE and shoot_cooldown == 0:
bullet = Actor('bullet')
bullet.x = ship.x
bullet.y = ship.y - 20
bullets.append(bullet)
shoot_cooldown = 15Étape 3 : ⭐ Stretch : ajouter des ennemis
Les ennemis apparaissent en haut et tombent vers le bas. Ajoute une liste :
enemies = []Une fonction de spawn :
def spawn_enemy():
enemy = Actor('enemy_drone')
enemy.x = random.randint(30, WIDTH - 30)
enemy.y = -30
enemy.speed = random.uniform(1, 3)
enemies.append(enemy)Appelle spawn_enemy() dans update() avec un intervalle de spawn :
# en haut :
spawn_counter = 0
spawn_interval = 120
# dans update() :
spawn_counter += 1
if spawn_counter >= spawn_interval:
spawn_counter = 0
spawn_enemy()Dessine les ennemis dans draw() :
for enemy in enemies:
enemy.draw()Étape 4 : 🔥 Expert : collision + vagues
Une balle touche un ennemi : supprime les deux, +10 points :
for bullet in bullets[:]:
bullet.y -= 8
if bullet.y < -10:
bullets.remove(bullet)
continue
for enemy in enemies[:]:
if bullet.colliderect(enemy):
bullets.remove(bullet)
enemies.remove(enemy)
global score
score += 10
breakUn ennemi touche le fond ou le vaisseau : tu perds une vie (comme pour un astéroïde).
Vagues : une nouvelle vague tous les 10 ennemis. Les ennemis apparaissent plus vite :
# en haut :
wave = 1
enemies_destroyed = 0
# à la destruction :
enemies_destroyed += 1
if enemies_destroyed % 10 == 0:
wave += 1
spawn_interval = max(60, spawn_interval - 10)Affiche la vague actuelle dans draw() :
screen.draw.text(f"Vague : {wave}", (10, 70), color="yellow", fontsize=24)Affiche « VAGUE N ! » en grand quand une nouvelle vague commence (utilise un timer).
Mouvement sinusoïdal : fais zigzaguer les ennemis de gauche à droite :
import math # en haut
enemy.x = enemy.start_x + math.sin(timer * 0.03 + enemy.strafe_offset) * 50Showcase
Montre ton Dojo Defender à un coach. Combien de vagues tu passes ? Tu as réussi le mouvement sinusoïdal ? Compare ton score avec un buddy.
À la prochaine !
« La prochaine fois : les POWER-UPS. Des boucliers, des speed-boosts et des tirs en éventail. Ton vaisseau devient de plus en plus fort à mesure que tu survis plus longtemps. »
À emporter chez toi
Essaie une de ces extensions à la maison :
- Variation d’ennemis — Utilise
enemy_charger.pngpour un ennemi plus rapide qui ne fait pas de sinus, mais qui fonce droit sur toi. - Son — Ajoute
sounds/laser.wavetsounds/explosion.wav. - Mode difficile — Les ennemis apparaissent de plus en plus vite, jusqu’à un maximum toutes les 30 frames.
- Multiplicateur de score — Plus la vague est haute, plus tu marques de points par kill :
score += 10 * wave.