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

  1. Ouvre Thonny.
  2. Télécharge le starter Dojo Defender d’aujourd’hui, décompresse le ZIP et ouvre main.py.
  3. Tu n’étais pas là la dernière fois ? Télécharge la solution de la session 1 et commence avec ça.
  4. Clique sur Run. Tu vois le même jeu que la dernière fois : vaisseau, astéroïdes, explosions.
  5. 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 = 0

Dans update() :

if shoot_cooldown > 0:
    shoot_cooldown -= 1

Adapte 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
            break

Un 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) * 50

Showcase

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 :

  1. Variation d’ennemis — Utilise enemy_charger.png pour un ennemi plus rapide qui ne fait pas de sinus, mais qui fonce droit sur toi.
  2. Son — Ajoute sounds/laser.wav et sounds/explosion.wav.
  3. Mode difficile — Les ennemis apparaissent de plus en plus vite, jusqu’à un maximum toutes les 30 frames.
  4. Multiplicateur de score — Plus la vague est haute, plus tu marques de points par kill : score += 10 * wave.

Télécharger Dojo Defender