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 een update()-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: met self.naam en een blaf()-methode. Vraag ninjas naar analogieën.
  • import math staat 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)

TijdActiviteit
0:00 tot 0:10Welkom, terugblik sessie 6
0:10 tot 0:25Projector: uitleg klassen en instanties
0:25 tot 1:30Zelfstandig werken: stap 1 en 2
1:30 tot 2:15Stretch (SlingerBug)
2:15 tot 2:45Expert (DuikBug) + buffer
2:45 tot 3:00Showcase + 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-onderdeelTijdWanneer?
DD Stap 1: Boss-variabelen15 minNa Bug Zapper Stap 2
DD Stap 2: Boss spawnen + HP-balk20 minNa Bug Zapper Stap 3
DD Stap 3: Boss AI (3 fases)30 minNa Bug Zapper Stap 4
DD Stap 4: Boss verslaan10 minAan 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?”