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éthode update().
  • 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: avec self.naam et une méthode blaf(). Demande aux ninjas des analogies.
  • import math est 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)

TempsActivité
0:00 à 0:10Accueil, récapitulatif de la session 6
0:10 à 0:25Projecteur : explication des classes et des instances
0:25 à 1:30Travail en autonomie : étapes 1 et 2
1:30 à 2:15Stretch (SlingerBug)
2:15 à 2:45Expert (DuikBug) + buffer
2:45 à 3:00Showcase + 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 DDTempsQuand ?
DD Étape 1 : variables du boss15 minAprès l’étape 2 de Bug Zapper
DD Étape 2 : spawn du boss + barre de HP20 minAprès l’étape 3 de Bug Zapper
DD Étape 3 : IA du boss (3 phases)30 minAprès l’étape 4 de Bug Zapper
DD Étape 4 : battre le boss10 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 ? »