Dojo Defender: Sessie 2
Je schip heeft nu een wapen. Vijanden komen eraan. Schiet ze neer voordat ze de bodem bereiken. Elke 10 vijanden betekent een nieuwe wave — en het wordt steeds moeilijker.
Wat je vandaag leert
- Schieten met de spatiebalk en een cooldown
- Lijsten voor kogels en vijanden
- Collision tussen kogels en vijanden
- Golven (waves) die steeds moeilijker worden
- Vijanden die sinus-bewegingen maken
Stap 0: Open de starter
- Open Thonny.
- Download de Dojo Defender starter voor vandaag, pak de ZIP uit en open
main.py. - Was je er vorige keer niet bij? Download de oplossing van sessie 1 en begin daarmee.
- Klik op Run. Je ziet hetzelfde spel als vorige keer: schip, asteroïden, explosies.
- Problemen? Kijk bij Thonny instellen.
Stap 1: Schieten met SPATIE
Je schip heeft een laserkanon. Voeg een lijst voor kogels toe bovenaan:
bullets = []Gebruik on_key_down — die wordt maar één keer aangeroepen als je een toets indrukt (in tegenstelling tot update die blijft herhalen):
def on_key_down(key):
if key == keys.SPACE:
bullet = Actor('bullet')
bullet.x = ship.x
bullet.y = ship.y - 20
bullets.append(bullet)Laat de kogels omhoog bewegen in update() en verwijder ze als ze uit beeld zijn:
for bullet in bullets[:]:
bullet.y -= 8
if bullet.y < -10:
bullets.remove(bullet)Vergeet niet de kogels te tekenen in draw():
for bullet in bullets:
bullet.draw()Stap 2: ✅ Basic: schiet-cooldown
Zonder cooldown vuur je tientallen kogels per seconde. Voeg een timer toe:
shoot_cooldown = 0In update():
if shoot_cooldown > 0:
shoot_cooldown -= 1Pas on_key_down aan zodat je alleen kunt schieten als de cooldown 0 is:
def on_key_down(key):
global shoot_cooldown
if key == keys.SPACE and shoot_cooldown == 0:
bullet = Actor('bullet')
bullet.x = ship.x
bullet.y = ship.y - 20
bullets.append(bullet)
shoot_cooldown = 15Stap 3: ⭐ Stretch: vijanden toevoegen
Vijanden spawnen bovenaan en vallen naar beneden. Voeg een lijst toe:
enemies = []Een spawn-functie:
def spawn_enemy():
enemy = Actor('enemy_drone')
enemy.x = random.randint(30, WIDTH - 30)
enemy.y = -30
enemy.speed = random.uniform(1, 3)
enemies.append(enemy)Roep spawn_enemy() aan in update() met een spawn-interval:
# bovenaan:
spawn_counter = 0
spawn_interval = 120
# in update():
spawn_counter += 1
if spawn_counter >= spawn_interval:
spawn_counter = 0
spawn_enemy()Teken vijanden in draw():
for enemy in enemies:
enemy.draw()Stap 4: 🔥 Expert: collision + waves
Kogel raakt vijand: verwijder beide, +10 punten:
for bullet in bullets[:]:
bullet.y -= 8
if bullet.y < -10:
bullets.remove(bullet)
continue
for enemy in enemies[:]:
if bullet.colliderect(enemy):
bullets.remove(bullet)
enemies.remove(enemy)
global score
score += 10
breakVijand raakt bodem of schip: verlies een leven (zelfde als asteroïde).
Waves: elke 10 vijanden een nieuwe wave. Vijanden spawnen sneller:
# bovenaan:
wave = 1
enemies_destroyed = 0
# bij destroy:
enemies_destroyed += 1
if enemies_destroyed % 10 == 0:
wave += 1
spawn_interval = max(60, spawn_interval - 10)Toon de huidige wave in draw():
screen.draw.text(f"Wave: {wave}", (10, 70), color="yellow", fontsize=24)Toon “WAVE N!” in het groot bij een nieuwe wave (gebruik een timer).
Sinus-beweging: laat vijanden links-rechts zwenken:
import math # bovenaan
enemy.x = enemy.start_x + math.sin(timer * 0.03 + enemy.strafe_offset) * 50Showcase
Laat je Dojo Defender zien aan een coach. Hoeveel waves haal jij? Heb je de sinus-beweging werkend? Vergelijk scores met een buddy.
Tot de volgende keer!
“Volgende keer: POWER-UPS. Schilden, speed-boosts en spread-shots. Je schip wordt steeds sterker naarmate je langer overleeft.”
Neem mee naar huis
Probeer thuis één van deze uitbreidingen:
- Vijandvariatie — Gebruik
enemy_charger.pngvoor een snellere vijand die geen sinus maakt, maar recht op je af komt. - Geluid — Voeg
sounds/laser.wavensounds/explosion.wavtoe. - Harde modus — Vijanden spawnen steeds sneller, tot maximaal elke 30 frames.
- Score multiplier — Hoe hoger de wave, hoe meer punten per kill:
score += 10 * wave.