Sessie 7: Coach-notities
Doel van deze sessie
Aan het einde van de Basic checkpoint kan een ninja:
- Een klasse schrijven met
__init__, attributen en eenupdate()-methode. - Bugs instantiëren en in een lijst bijhouden.
- Botsingsdetectie toepassen tussen kogels en bugs.
Wat niet verwacht wordt na sessie 7: subklassen, math.sin-beweging, DuikBug. Die zijn Stretch/Expert-materiaal.
Voorbereiding (30 min vóór de sessie)
- Klassen uitleggen in 5 minuten op de projector. Dit is het belangrijkste nieuwe concept. Gebruik een eenvoudig voorbeeld:
class Hond:metself.naamen eenblaf()-methode. Vraag ninjas naar analogieën. import mathstaat al in de starter, dus ninjas hoeven dat niet zelf te zoeken voor Stap 3.- Controleer de spawn-timer in de starter (standaard elke 90 frames). Pas dit aan als de moeilijkheidsgraad niet klopt voor je groep.
Tijdsindeling (3 uur)
| Tijd | Activiteit |
|---|---|
| 0:00 tot 0:10 | Welkom, terugblik sessie 6 |
| 0:10 tot 0:25 | Projector: uitleg klassen en instanties |
| 0:25 tot 1:30 | Zelfstandig werken: stap 1 en 2 |
| 1:30 tot 2:15 | Stretch (SlingerBug) |
| 2:15 tot 2:45 | Expert (DuikBug) + buffer |
| 2:45 tot 3:00 | Showcase + cliffhanger |
Veelgestelde vragen
“AttributeError: ‘Bug’ object has no attribute ‘alive’”
self.alive = True ontbreekt in __init__. Laat de ninja __init__ controleren: is het inspringing correct? Staat self. voor alive?
“SlingerBug beweegt niet; hij gaat gewoon recht naar beneden”
super().__init__ roept Bug.__init__ aan, maar self.timer is dan nog niet aangemaakt als Bug.update() ook aangeroepen wordt in plaats van SlingerBug.update(). Vraag: “Welke update() roep je aan?” Python zoekt update op in de meest specifieke klasse eerst (de subklasse).
“DuikBug vliegt het scherm uit”
De player_x_ref lambda capture werkt soms verrassend. Controleer dat de lambda lambda: player_x gebruikt (een functie), niet player_x (een waarde op het moment van aanmaken). Als player_x een globale variabele is, werkt de lambda correct.
“Kogels verdwijnen maar bugs ook niet”
De botsingsloop verwijdert de kogel maar vergeet bug.alive = False of bugs.remove(bug). Laat de ninja de stap-2-code vergelijken met zijn eigen versie, regel per regel.
Hints voor Stretch en Expert
Stretch: SlingerBug:
math.sin(timer) geeft een waarde tussen -1 en 1. Vermenigvuldig met een getal (bijv. 60) voor de amplitude van de slinger. timer moet elke frame met een klein getal ophogen (bijv. 0.05); groter betekent sneller slingeren.
Expert: DuikBug:
De lambda lambda: player_x werkt alleen als player_x een variabele is die in scope is. Als de speler een pygame.Rect is, gebruik dan lambda: player_rect.centerx. Benadruk dat dit een referentie naar een functie is, geen waarde; het geeft elke keer de huidige positie.
Dojo Defender vandaag
Deze sessie bouwen ninja’s ook de eindbaas voor Dojo Defender (sessie 6 van de DD-track). Zie de DD sessie 6 coach-notities voor de volledige begeleiding.
Tijdsverdeling Dojo Defender
| DD-onderdeel | Tijd | Wanneer? |
|---|---|---|
| DD Stap 1: Boss-variabelen | 15 min | Na Bug Zapper Stap 2 |
| DD Stap 2: Boss spawnen + HP-balk | 20 min | Na Bug Zapper Stap 3 |
| DD Stap 3: Boss AI (3 fases) | 30 min | Na Bug Zapper Stap 4 |
| DD Stap 4: Boss verslaan | 10 min | Aan het einde |
Starter ZIP
Maak de starter ZIP van de DD S5-oplossing voordat de sessie begint:
code/sessions/06-platformer/dojo-defender-solution/ → zip als dojo-defender-s7-starter.zip.
Zorg dat boss.png, boss_minion.png en boss_roar.wav in de ZIP zitten.
Cliffhanger-script
Lees dit voor aan de groep:
“Vandaag heb je je eigen klassen geschreven: bugs die denken, bewegen en op je afduiken. Volgende keer bouw je een oneindige luchtweg die voorbij SCROLT, met obstakels die steeds sneller komen. Kun jij het overleven?”