Dojo Defender Session 2 : Notes du coach

Objectif de cette session

Après cette session, un ninja sait :

  • Créer des balles avec on_key_down et un mécanisme de cooldown
  • Faire apparaître des objets ennemis et les faire bouger avec une oscillation sinusoïdale
  • Détecter les collisions entre les balles et les ennemis (boucle imbriquée)
  • Mettre en place un système de vagues avec une difficulté qui monte

Préparation (30 min avant la session)

  • Les ZIP du starter prêts sur USB et sur le site : dojo-defender-s3-starter.fr.zip et dojo-defender-s3-solution.fr.zip.
  • Lancer le starter une fois sur le portable de la salle dojo.
  • Les ninjas qui ont manqué la S1 : renvoie-les vers la solution de la S1.

Répartition du temps (3 heures)

Cette session fait partie intégrante de la session 3 normale (Space Blaster). Utilise le temps comme ceci :

TempsActivité
0:00 à 1:00Session 3 : Space Blaster (étapes 1-4)
1:00 à 1:15Retour sur Dojo Defender + télécharger le starter
1:15 à 1:45Étapes 1-2 : tirer + cooldown
1:45 à 2:15Étape 3 : faire apparaître + bouger les ennemis
2:15 à 2:45Étape 4 : collision + vagues
2:45 à 3:00Showcase + cliffhanger

Questions fréquentes

« on_key_down n’est pas reconnu » C’est un callback Pgzero — la fonction doit s’appeler exactement on_key_down avec key comme paramètre. Pas de fautes de frappe.

« Mes balles disparaissent tout de suite » Les balles font y -= 8 mais commencent à ship.y - 20. Vérifie que bullet.y n’est pas tout de suite sous -10. Si le vaisseau est trop haut, ça peut arriver.

« RuntimeError: list changed during iteration » Le ninja utilise for enemy in enemies (sans [:]) alors qu’il appelle enemies.remove(). Explique que [:] crée une copie.

« Les ennemis ne bougent pas en sinus » L’oscillation sinusoïdale a besoin de start_x, strafe_amplitude et strafe_speed comme champs de l’Actor. Les ninjas plus jeunes peuvent d’abord faire un simple mouvement de ping-pong.

« Le compteur de vagues ne va pas » enemies_destroyed % 10 == 0 se déclenche tous les 10 kills. Si le ninja ne déclare pas enemies_destroyed en global dans la fonction, le compteur ne marche pas.


Indices pour Stretch et Expert

Basic : cooldown de tir Explique pourquoi le cooldown est nécessaire : sans cooldown, l’ordinateur tire des milliers de balles par seconde quand ESPACE reste enfoncée.

Stretch : ennemis spawn_interval = 120, c’est 2 secondes à 60 fps. À mesure que le score monte, l’intervalle descend jusqu’à 60 (1 seconde).

Expert : collision + vagues La boucle imbriquée (balles × ennemis) est le concept le plus difficile. Dessine-le au tableau : pour chaque balle, tu vérifies tous les ennemis. break est nécessaire pour arrêter après un hit.

Expert : mouvement sinusoïdal math.sin(timer * speed + offset) * amplitude est une onde. timer fait que l’onde continue d’avancer. Sans start_x, l’ennemi s’éloigne de sa position de départ.


Script du cliffhanger

« Aujourd’hui, tu as abattu des ennemis et survécu aux vagues. La prochaine fois : les POWER-UPS. Des boucliers qui te protègent, des speed-boosts qui te rendent plus rapide et des tirs en éventail qui lancent trois balles à la fois. Ton vaisseau devient plus fort à mesure que tu survis plus longtemps. »