<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dojo Defender : Session 6 :: CoderDojo Python &amp; Pygame</title><link>https://python.coderdojohasselt.be/fr/dojo-defender/session-6/index.html</link><description>Aujourd’hui, tu ajoutes un boss final à Dojo Defender. Le boss apparaît toutes les 5 waves et a 3 phases avec leur propre comportement. Tu apprends à travailler avec une state machine maison, des barres de HP et des effets de screen shake.
Ce que tu vas apprendre aujourd’hui State machine pour un boss : PHASE_1, PHASE_2, PHASE_3 et EXPLODING Barre de HP à dessiner avec un dégradé de couleur (vert → jaune → rouge) Balles qui cherchent leur cible : une balle qui se dirige vers le joueur Screen shake : un décalage aléatoire sur les coordonnées de dessin Transitions de phase avec des effets visuels Étape 0 : Télécharge le starter Le starter est la solution de la session 5 — Dojo Defender avec étoiles en parallaxe, particules et astéroïdes qui se divisent.</description><generator>Hugo</generator><language>fr-BE</language><atom:link href="https://python.coderdojohasselt.be/fr/dojo-defender/session-6/index.xml" rel="self" type="application/rss+xml"/><item><title>Dojo Defender Session 6 : Cheatsheet</title><link>https://python.coderdojohasselt.be/fr/dojo-defender/session-6/cheatsheet/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/fr/dojo-defender/session-6/cheatsheet/index.html</guid><description>Démarrer le boss def start_boss(): global boss_active, boss, boss_hp, boss_phase boss_active = True boss = GameObject('boss.png', WIDTH / 2, -80) boss_hp = 50 boss_phase = "PHASE_1" ... def check_boss_wave(): if wave >= 5 and wave % 5 == 0 and not boss_active: start_boss() IA du boss — state machine if boss.rect.centery &lt; 80: boss.rect.centery += 2 else: if boss_phase == "PHASE_1": # Dérive lentement, un tir de temps en temps boss.rect.centerx += boss_direction * 1.5 if boss_shoot_timer >= 60: fire_boss_bullet() elif boss_phase == "PHASE_2": # Plus vite + minions boss.rect.centerx += boss_direction * 3 if boss_shoot_timer >= 40: fire_boss_bullet() if boss_minion_spawn_timer >= 180: spawn_boss_minion() elif boss_phase == "PHASE_3": # Enraged + screen shake boss.rect.centerx += boss_direction * 4 if boss_shoot_timer >= 20: fire_boss_bullet() Transition de phase hp_ratio = boss_hp / boss_hp_max if hp_ratio &lt;= 0.66 and boss_phase == "PHASE_1": boss_phase = "PHASE_2" boss_phase_transition_timer = 20 if hp_ratio &lt;= 0.33 and boss_phase == "PHASE_2": boss_phase = "PHASE_3" boss_phase_transition_timer = 20 Vérification de la dernière phase if hp_ratio &lt;= 0.33 and boss_phase == "PHASE_2": boss_phase = "PHASE_3" boss_phase_transition_timer = 20 Balle qui cherche sa cible def fire_boss_bullet(): dx = ship.rect.centerx - boss.rect.centerx dy = ship.rect.centery - boss.rect.centery dist = math.sqrt(dx * dx + dy * dy) if dist == 0: dist = 1 boss_bullets.append({ 'x': boss.rect.centerx, 'y': boss.rect.centery + 30, 'vx': dx / dist * 3, 'vy': dy / dist * 3, }) Screen shake # Dans l'update : if boss_phase == "PHASE_3": screen_shake_x = random.randint(-3, 3) screen_shake_y = random.randint(-3, 3) # Dans le draw, ajouter un offset partout : draw_stars(screen, screen_shake_x, screen_shake_y) Barre de HP bar_width, bar_height = 300, 20 bar_x = (WIDTH - bar_width) // 2 bar_y = 10 pygame.draw.rect(screen, (100, 20, 20), (bar_x, bar_y, bar_width, bar_height)) hp_ratio = max(0, boss_hp / boss_hp_max) fill_width = int(bar_width * hp_ratio) color = (0, 255, 0) if hp_ratio > 0.5 else (255, 255, 0) if hp_ratio > 0.25 else (255, 0, 0) pygame.draw.rect(screen, color, (bar_x, bar_y, fill_width, bar_height)) pygame.draw.rect(screen, (255, 255, 255), (bar_x, bar_y, bar_width, bar_height), 2) Boss defeated if boss_hp &lt;= 0: boss_phase = "EXPLODING" boss_defeated_timer = 90 score += 500 if boss_phase == "EXPLODING": if boss_phase_transition_timer % 10 == 0: spawn_particles(...)</description></item><item><title>Dojo Defender Session 6 : Démo</title><link>https://python.coderdojohasselt.be/fr/dojo-defender/session-6/demo/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/fr/dojo-defender/session-6/demo/index.html</guid><description>Comment montrer la solution Ouvre un terminal dans le dossier du projet. Lance : uv run python3 code/sessions/07-bug-zapper/dojo-defender-solution/main.py Montre :
ESPACE lance le jeu, tire jusqu’à la wave 5 Wave 5 : le boss entre par le haut Barre de HP en haut : vert → jaune → rouge à mesure que les HP baissent Phase 1 : dérive lentement, une balle rouge de temps en temps Phase 2 : bouge plus vite, tire plus souvent, des minions apparaissent Phase 3 : l’écran tremble, 2 balles à la fois Transition de phase : le boss clignote en blanc Vaincre le boss : grosse explosion + « BOSS DEFEATED! » + 500 points Les waves ordinaires continuent après le boss Points de code à montrer :</description></item><item><title>Dojo Defender Session 6 : Notes du coach</title><link>https://python.coderdojohasselt.be/fr/dojo-defender/session-6/mentor-notes/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/fr/dojo-defender/session-6/mentor-notes/index.html</guid><description>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 :</description></item></channel></rss>