Session 7 : Notes du coach
Objectif de cette session
À la fin du checkpoint Basic, un ninja sait :
- Écrire une classe avec
__init__, des attributs et une méthodeupdate(). - Instancier des bugs et les garder dans une liste.
- Appliquer la détection de collision entre les projectiles et les bugs.
Ce qui n’est pas attendu après la session 7 : les sous-classes, le mouvement avec math.sin, le DuikBug. Ça, c’est du matériel Stretch/Expert.
Préparation (30 min avant la session)
- Expliquer les classes en 5 minutes au projecteur. C’est le concept nouveau le plus important. Utilise un exemple simple :
class Hond:avecself.naamet une méthodeblaf(). Demande aux ninjas des analogies. import mathest déjà dans le starter, donc les ninjas ne doivent pas le chercher eux-mêmes pour l’étape 3.- Vérifie le timer de spawn dans le starter (par défaut toutes les 90 frames). Adapte-le si le niveau de difficulté ne colle pas à ton groupe.
Répartition du temps (3 heures)
| Temps | Activité |
|---|---|
| 0:00 à 0:10 | Accueil, récapitulatif de la session 6 |
| 0:10 à 0:25 | Projecteur : explication des classes et des instances |
| 0:25 à 1:30 | Travail en autonomie : étapes 1 et 2 |
| 1:30 à 2:15 | Stretch (SlingerBug) |
| 2:15 à 2:45 | Expert (DuikBug) + buffer |
| 2:45 à 3:00 | Showcase + cliffhanger |
Questions fréquentes
« AttributeError: ‘Bug’ object has no attribute ‘alive’ »
self.alive = True manque dans __init__. Fais vérifier le __init__ au ninja : l’indentation est correcte ? Il y a bien self. devant alive ?
« Le SlingerBug ne bouge pas ; il descend tout droit »
super().__init__ appelle bien Bug.__init__, mais self.timer n’existe pas encore si c’est Bug.update() qui est appelée au lieu de SlingerBug.update(). Demande : « Quelle update() tu appelles ? » Python cherche update d’abord dans la classe la plus spécifique (la sous-classe).
« Le DuikBug sort de l’écran »
La capture par la lambda player_x_ref réserve parfois des surprises. Vérifie que la lambda utilise lambda: player_x (une fonction) et pas player_x (la valeur au moment de la création). Si player_x est une variable globale, la lambda fonctionne correctement.
« Les projectiles disparaissent mais pas les bugs »
La boucle de collision enlève le projectile mais oublie bug.alive = False ou bugs.remove(bug). Fais comparer au ninja le code de l’étape 2 avec sa propre version, ligne par ligne.
Indices pour Stretch et Expert
Stretch : SlingerBug :
math.sin(timer) donne une valeur entre -1 et 1. Multiplie par un nombre (par exemple 60) pour l’amplitude de l’oscillation. timer doit augmenter d’un petit nombre à chaque frame (par exemple 0.05) ; plus grand veut dire oscillation plus rapide.
Expert : DuikBug :
La lambda lambda: player_x ne marche que si player_x est une variable dans le scope. Si le joueur est un pygame.Rect, utilise lambda: player_rect.centerx. Insiste sur le fait que c’est une référence à une fonction, pas une valeur ; elle donne chaque fois la position actuelle.
Dojo Defender aujourd’hui
Dans cette session, les ninjas construisent aussi le boss final pour Dojo Defender (session 6 de la piste DD). Voir les notes du coach de la session DD 6 pour l’accompagnement complet.
Répartition du temps Dojo Defender
| Partie DD | Temps | Quand ? |
|---|---|---|
| DD Étape 1 : variables du boss | 15 min | Après l’étape 2 de Bug Zapper |
| DD Étape 2 : spawn du boss + barre de HP | 20 min | Après l’étape 3 de Bug Zapper |
| DD Étape 3 : IA du boss (3 phases) | 30 min | Après l’étape 4 de Bug Zapper |
| DD Étape 4 : battre le boss | 10 min | À la fin |
ZIP du starter
Prépare le ZIP du starter à partir de la solution DD S5 avant le début de la session :
code/sessions/python/06-platformer/dojo-defender-solution/ → compresse-le en dojo-defender-s7-starter.zip.
Vérifie que boss.png, boss_minion.png et boss_roar.wav sont bien dans le ZIP.
Script du cliffhanger
Lis ceci au groupe :
« Aujourd’hui, tu as écrit tes propres classes : des bugs qui pensent, qui bougent et qui plongent sur toi. La prochaine fois, tu construis une route aérienne infinie qui DÉFILE devant toi, avec des obstacles qui arrivent de plus en plus vite. Tu arrives à survivre ? »