Session 6 : Notes du coach

Objectif de cette session

À la fin du checkpoint Basic, un ninja sait :

  • Faire tomber le personnage grâce à vel_y et à la gravité.
  • S’arrêter correctement sur les plateformes via colliderect.
  • Sauter avec ESPACE (seulement quand on_ground vaut True).

Ce qui n’est pas attendu après la session 6 : le son, l’écran de victoire, le double saut. Ça, c’est du matériel Expert.


Préparation (30 min avant la session)

  • Teste le ZIP du starter sur un laptop de la salle dojo. Vérifie que pygame est installé (pas pgzero ; c’est la première session avec du pygame pur).
  • sounds/jump.wav présent ? Vérifie que le fichier son est bien dans le ZIP.
  • Projette l’étape 1 en direct à l’écran avant que les ninjas commencent. Le saut de pgzrun vers pygame est un cap mental. Explique que pygame est la même bibliothèque, mais sans le wrapper pgzrun.

Répartition du temps (3 heures)

TempsActivité
0:00 à 0:10Accueil, récapitulatif de la session 5
0:10 à 0:25Projecteur : explication game loop pygame vs. pgzrun
0:25 à 1:30Travail en autonomie : étapes 1 et 2
1:30 à 2:15Stretch et Expert
2:15 à 2:45Buffer / passer dans les rangs / aider
2:45 à 3:00Showcase + cliffhanger

Questions fréquentes

« Le personnage traverse les plateformes » Vérifie l’ordre : augmenter vel_y → adapter player_rect.y → la boucle des plateformes. Si la boucle des plateformes est avant le mouvement, ça ne marche pas. Fais comparer au ninja l’ordre de son code avec la fiche de travail.

« Le personnage saute alors qu’il est en l’air » on_ground n’est pas réglé correctement. Vérifie que on_ground = False est là avant la boucle des plateformes et qu’il ne passe à True que quand une collision est détectée. Erreur fréquente : on_ground est mis à True globalement.

« Pas de son » Deux causes :

  1. pygame.mixer.init() n’est pas placé avant pygame.mixer.Sound(...).
  2. Le script est lancé depuis un autre dossier. Python cherche alors sounds/jump.wav dans le dossier de travail, pas à côté de main.py. Le starter utilise _DIR = os.path.dirname(os.path.abspath(__file__)) pour régler ça.

« La fenêtre se ferme directement sur l’écran de victoire » running = False arrête la game loop. Si le ninja veut que l’écran reste, remplace running = False par sa propre boucle d’attente : pygame.time.wait(3000) suivi de break.


Indices pour Stretch et Expert

Donne des indices, pas du code complet.

Stretch : ramasser les étoiles : Montre stars[:]. Sans la copie-slice, tu obtiens une RuntimeError quand tu supprimes pendant l’itération. C’est un bon moment pour parler de mutation de liste.

Expert : le son : Si pygame.mixer renvoie une erreur, vérifie que le système a un périphérique audio. Dans une VM ou sur certains Chromebooks, la sortie audio manque. En fallback : saute le son et concentre-toi sur l’écran de victoire.


Dojo Defender aujourd’hui

La session 5 de Dojo Defender est intégrée à cette session. Le snapshot ajoute :

  • Étoiles en parallaxe (trois couches, qui défilent aussi dans le menu)
  • Système de particules (spawn/update/draw avec alpha-fade)
  • Gaz d’échappement, débris d’explosion, étincelles
  • Astéroïdes destructibles (big → med → small → particles)

Voir content/dojo-defender/session-5/ pour la fiche de travail complète.

Le ZIP du starter se trouve ici : /sessions/python/06-platformer/dojo-defender-s6-starter.zip. Le ZIP de la solution se trouve ici : /sessions/python/06-platformer/dojo-defender-s6-solution.zip.

Répartition du temps : les 75 premières minutes, tu travailles sur le platformer, le reste du temps sur Dojo Defender.


Script du cliffhanger

Lis ceci au groupe :

« Aujourd’hui, ton personnage a sauté et ramassé des étoiles. La prochaine fois, on écrit nos PROPRES classes : des bugs qui tombent vers le bas, et c’est à toi de les ZAPPER avant qu’ils te touchent. Et tu les fabriques toi-même, de zéro. »