Dojo Defender Session 6 : Notes du coach

Objectif de cette session

Après cette session, un ninja sait :

  • Construire une state machine pour un boss (PHASE_1/2/3/EXPLODING)
  • Dessiner une barre de HP avec un remplissage et une couleur dynamiques
  • Créer des balles qui cherchent leur cible avec des maths de vecteurs (dx / dist * speed)
  • Implémenter du screen shake via un offset de dessin aléatoire
  • Montrer des transitions de phase avec des effets visuels (clignotement)

Préparation (30 min avant la session)

  • Les ZIP du starter prêts sur USB et sur le site : dojo-defender-s7-starter.fr.zip et dojo-defender-s7-solution.fr.zip.
  • Lancer le starter une fois sur le portable de la salle dojo.
  • Vérifie que boss.png et boss_minion.png se trouvent dans le dossier images/ du starter.
  • Explique la state machine au tableau : dessine un diagramme circulaire avec 4 états (PHASE_1 → PHASE_2 → PHASE_3 → EXPLODING) et des flèches entre eux.
  • Explique le vecteur unitaire : « dx / dist » donne une direction de longueur 1. Pratique pour des balles dans TOUTES les directions.

Répartition du temps (3 heures)

Cette session fait partie intégrante de la session normale 7 (Bug Zapper). Utilise le temps comme ceci :

TempsActivité
0:00 à 1:15Session 7 : Bug Zapper (étapes 1-4)
1:15 à 1:30Intro Dojo Defender : state machine au tableau
1:30 à 2:00Étape 1 : variables du boss (Basic)
2:00 à 2:20Étape 2 : faire apparaître le boss + barre de HP (Stretch)
2:20 à 2:50Étape 3 : IA du boss + 3 phases (Expert)
2:50 à 3:00Étape 4 : vaincre le boss + showcase

Questions fréquentes

« Le boss n’apparaît pas à la wave 5 » Vérifie que check_boss_wave() est appelé après wave += 1. Aussi : le test wave >= 5 and wave % 5 == 0 doit être correct. Wave 5, 10, 15, etc.

« Le boss ne tire pas » fire_boss_bullet() n’est appelé que si le timer compte et se remet à zéro. Vérifie que boss_shoot_timer est bien incrémenté et remis à zéro.

« Les minions apparaissent sans arrêt » La fonction spawn_boss_minion() a un timer de 180 frames (~3 secondes à 60 fps). Les ninjas peuvent adapter ça.

« L’écran tremble aussi après le boss » screen_shake_x et screen_shake_y doivent être remis à 0 quand le boss n’est plus là. Mets une branche else : screen_shake_x = 0.

« La barre de HP est vide » boss_hp / boss_hp_max peut valoir 0 si boss_hp n’est pas initialisé correctement. Vérifie que start_boss() met vraiment boss_hp = boss_hp_max.

« Les balles ne touchent pas le boss » Le test de collision du boss doit venir après la boucle des ennemis mais avant l’itération suivante des balles. Les ninjas oublient parfois d’ajouter if boss_active:.


Indices pour Stretch et Expert

Stretch : faire apparaître le boss + barre de HP La barre de HP est une instruction de dessin séparée qui ne rentre pas dans GameObject.draw(). Les ninjas doivent utiliser pygame.draw.rect() directement pour la barre. Fais-leur d’abord dessiner une barre vide, puis le remplissage, puis le contour.

Expert : IA du boss La state machine est le concept le plus difficile. Dessine au tableau :

  • PHASE_1 : lent, 1 balle par 60 frames
  • PHASE_2 : plus vite, 1 balle par 40 frames + des minions
  • PHASE_3 : rapide, 2 balles par 20 frames + des minions + screen shake

La transition de phase se fait à des seuils de HP (66 % et 33 %). Fais calculer les seuils aux ninjas : 50 * 0.66 ≈ 33, 50 * 0.33 ≈ 16.

Screen shake : Ajouter un offset aléatoire aux coordonnées de dessin est simple, mais il faut le faire partout : étoiles, particules, ennemis, le boss lui-même. La façon la plus simple : draw_stars(screen, screen_shake_x, screen_shake_y) et passer l’offset en paramètre.


Script du cliffhanger

« Aujourd’hui, tu as construit un boss final avec 3 phases, des balles qui cherchent leur cible et du screen shake. La prochaine fois : la version polie. Un écran de menu, des effets sonores, des high scores — et après, c’est à toi d’en faire ce que tu veux. »