<?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: Sessie 6 :: CoderDojo Python &amp; Pygame</title><link>https://python.coderdojohasselt.be/dojo-defender/session-6/index.html</link><description>Vandaag voeg je een eindbaas (boss) toe aan Dojo Defender. De boss verschijnt om de 5 waves en heeft 3 fases met eigen gedrag. Je leert werken met een eigen state machine, HP-balken en schermeffecten.
Wat je vandaag leert State machine voor een baas: PHASE_1, PHASE_2, PHASE_3 en EXPLODING HP-balk tekenen met kleurverloop (groen → geel → rood) Doelzoekende kogels: een kogel die naar de speler beweegt Screen shake: willekeurige offset op teken-coördinaten Fase-overgangen met visuele effecten Stap 0: Download de starter De starter is de oplossing van sessie 5 — Dojo Defender met parallax sterren, particles en splitsende asteroïden.</description><generator>Hugo</generator><language>nl</language><atom:link href="https://python.coderdojohasselt.be/dojo-defender/session-6/index.xml" rel="self" type="application/rss+xml"/><item><title>Dojo Defender Sessie 6: Cheatsheet</title><link>https://python.coderdojohasselt.be/dojo-defender/session-6/cheatsheet/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/dojo-defender/session-6/cheatsheet/index.html</guid><description>Boss starten 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() Boss AI — state machine if boss.rect.centery &lt; 80: boss.rect.centery += 2 else: if boss_phase == "PHASE_1": # Langzaam drijven, af en toe een kogel boss.rect.centerx += boss_direction * 1.5 if boss_shoot_timer >= 60: fire_boss_bullet() elif boss_phase == "PHASE_2": # Sneller + 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() Fase-overgang 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 Laatste fase check if hp_ratio &lt;= 0.33 and boss_phase == "PHASE_2": boss_phase = "PHASE_3" boss_phase_transition_timer = 20 Doelzoekende kogel 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 # In update: if boss_phase == "PHASE_3": screen_shake_x = random.randint(-3, 3) screen_shake_y = random.randint(-3, 3) # In draw, overal een offset toevoegen: draw_stars(screen, screen_shake_x, screen_shake_y) HP-balk 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 Sessie 6: Coach-notities</title><link>https://python.coderdojohasselt.be/dojo-defender/session-6/mentor-notes/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/dojo-defender/session-6/mentor-notes/index.html</guid><description>Doel van deze sessie Na deze sessie kan een ninja:
Een state machine bouwen voor een boss (PHASE_1/2/3/EXPLODING) Een HP-balk tekenen met dynamische vulgraad en kleur Doelzoekende kogels maken met vector-wiskunde (dx / dist * speed) Screen shake implementeren via willekeurige teken-offset Fase-overgangen tonen met visuele effecten (knipperen) Voorbereiding (30 min vóór de sessie) Starter ZIPs klaar op USB en de site: dojo-defender-s7-starter.zip en dojo-defender-s7-solution.zip. De starter éénmaal draaien op de dojoruimte-laptop. Controleer of boss.png en boss_minion.png in de images/ map van de starter zitten. Leg de state machine uit op het bord: teken een cirkeldiagram met 4 toestanden (PHASE_1 → PHASE_2 → PHASE_3 → EXPLODING) en pijlen ertussen. Leg eenheidsvector uit: “dx / dist” geeft een richting met lengte 1. Handig voor kogels in élke richting. Tijdsindeling (3 uur) Deze sessie is integraal onderdeel van de normale sessie 7 (Bug Zapper). Gebruik de tijd als volgt:</description></item><item><title>Dojo Defender Sessie 6: Demo</title><link>https://python.coderdojohasselt.be/dojo-defender/session-6/demo/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/dojo-defender/session-6/demo/index.html</guid><description>Hoe demonstreer je de oplossing Open een terminal in de projectmap. Voer uit: uv run python3 code/sessions/07-bug-zapper/dojo-defender-solution/main.py Laat zien:
SPACE start het spel, schiet tot wave 5 Wave 5: de boss komt binnen van bovenaf HP-balk bovenaan: groen → geel → rood naarmate HP daalt Fase 1: langzaam drijven, af en toe een rode kogel Fase 2: sneller bewegen, vaker kogels, minions spawnen Fase 3: scherm schudt, 2 kogels tegelijk Fase-overgang: boss knippert wit Boss verslaan: grote explosie + “BOSS DEFEATED!” + 500 punten Gewone waves gaan verder na de boss Code-highlights om te tonen:</description></item></channel></rss>