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.zipetdojo-defender-s7-solution.fr.zip. - Lancer le starter une fois sur le portable de la salle dojo.
- Vérifie que
boss.pngetboss_minion.pngse trouvent dans le dossierimages/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 :
| Temps | Activité |
|---|---|
| 0:00 à 1:15 | Session 7 : Bug Zapper (étapes 1-4) |
| 1:15 à 1:30 | Intro 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. »