Dojo Defender: Sessie 1
Je ruimteschip is geland in de donkere ruimte. Tijd om het tot leven te brengen. In deze sessie voeg je een bestuurbaar schip toe en laat je asteroïden naar beneden vallen. Ontwijk ze of verlies een leven. Hoe lang overleef jij?
Wat je vandaag leert
- Lijsten gebruiken om meerdere asteroïden bij te houden
- Objecten spawnen en verwijderen
- Botsingen detecteren met
colliderect - Levens bijhouden en een explosie-effect tonen
- Game-over afdwingen als je levens op zijn
Stap 0: Installeren
- Open Thonny.
- Download de Dojo Defender starter, pak de ZIP uit en open
main.py. - Klik op Run. Je ziet een donkerblauw scherm met je ruimteschip onderaan. Je kan het al bewegen met de pijltjestoetsen.
- Problemen? Kijk bij Thonny instellen.
Stap 1: Laat asteroïden spawnen
Een game zonder gevaar is saai. Voeg een lijst toe waarin je alle asteroïden bijhoudt, en een functie die nieuwe asteroïden aanmaakt:
# bovenaan, na WIDTH en HEIGHT:
asteroids = []
def spawn_asteroid():
rock = Actor('asteroid_big')
rock.x = random.randint(30, WIDTH - 30)
rock.y = -30
rock.speed = random.uniform(3, 5)
asteroids.append(rock)Je hebt ook import random nodig bovenaan het bestand. Voeg die regel toe.
Roep de functie aan in update() met een teller zodat niet élke frame een asteroïde verschijnt:
# bovenaan, buiten de functies:
timer = 0
def update():
global timer
timer += 1
if timer % 60 == 0: # elke seconde (60 frames)
spawn_asteroid()Zet dit vóór de bewegingscode van het schip.
Stap 2: ✅ Basic: asteroïden laten vallen en tekenen
Asteroïden moeten naar beneden vallen en verdwijnen als ze het scherm uit zijn:
def update():
global timer
timer += 1
if timer % 60 == 0:
spawn_asteroid()
for rock in asteroids[:]: # [:] = kopie zodat je veilig kunt verwijderen
rock.y += rock.speed
if rock.y > HEIGHT + 30:
asteroids.remove(rock)Vergeet niet om de asteroïden te tekenen in draw():
def draw():
screen.fill((10, 10, 30))
for rock in asteroids:
rock.draw()
ship.draw()Stap 3: ⭐ Stretch: botsing + levens
Als een asteroïde je schip raakt, verlies je een leven. Voeg lives en game_over toe bovenaan:
lives = 3
game_over = FalseVoeg in de for-loop collision-detectie toe:
for rock in asteroids[:]:
rock.y += rock.speed
if rock.y > HEIGHT + 30:
asteroids.remove(rock)
elif rock.colliderect(ship):
asteroids.remove(rock)
global lives, game_over
lives -= 1
if lives <= 0:
game_over = TrueToon de levens en score in draw():
screen.draw.text(f"Score: {score}", (10, 10), color="white", fontsize=24)
screen.draw.text(f"Lives: {lives}", (10, 40), color="red", fontsize=24)Stop het spel als game_over True is:
def update():
if game_over:
return
...Toon een game-over scherm in draw():
if game_over:
screen.draw.text(
"GAME OVER",
center=(WIDTH / 2, HEIGHT / 2),
color="red",
fontsize=60,
)
screen.draw.text(
f"Final Score: {score}",
center=(WIDTH / 2, HEIGHT / 2 + 60),
color="white",
fontsize=30,
)Stap 4: 🔥 Expert: explosies + onzichtbaarheid
Als een asteroïde je raakt, wil je een explosie zien in plaats van dat het schip zomaar verdwijnt. Gebruik de vier explosie-frames (explosion_1 t/m explosion_4):
explosion = Actor('explosion_1')
explosion_active = False
explosion_frame = 0
explosion_timer = 0Bij een botsing: verberg het schip, start de explosie:
elif rock.colliderect(ship):
asteroids.remove(rock)
global lives, game_over, explosion_active, explosion_frame, explosion_timer
lives -= 1
explosion.pos = (ship.x, ship.y)
explosion.image = 'explosion_1'
explosion_frame = 1
explosion_timer = 5
explosion_active = True
ship.visible = False
if lives <= 0:
game_over = TrueLaat de explosie afspelen in update():
if explosion_active:
explosion_timer -= 1
if explosion_timer <= 0:
explosion_frame += 1
if explosion_frame > 4:
explosion_active = False
ship.visible = True
ship.pos = (WIDTH / 2, HEIGHT - 50)
else:
explosion.image = f'explosion_{explosion_frame}'
explosion_timer = 5Voeg daarna een onzichtbaarheidsperiode toe zodat je niet meteen opnieuw geraakt wordt:
invincible = False
invincible_timer = 0In update():
if invincible:
invincible_timer -= 1
if invincible_timer <= 0:
invincible = False
ship.visible = TruePas de collision-check aan:
elif rock.colliderect(ship) and not invincible and ship.visible:Teken de explosie in draw():
if explosion_active:
explosion.draw()Showcase
Laat je Dojo Defender zien aan een coach en een buddy. Hoe lang overleef jij? Heb je explosies? Ziet het er vet uit?
Tot de volgende keer!
“Volgende keer: je ruimteschip SCHIET TERUG. Vijanden in formatie, en jij blast ze weg met lasers. Dit wordt episch.”
Neem mee naar huis
Probeer thuis één van deze uitbreidingen:
- Geluid — Voeg
sounds/explosion.wavtoe als een asteroïde ontploft (sounds.explosion.play()). - Moeilijker — Laat asteroïden sneller vallen naarmate de score stijgt:
rock.speed = random.uniform(3 + score // 10, 5 + score // 10). - Power-up — Voeg een zeldzame groene power-up toe die een extra leven geeft.
- Kleiner — Gebruik
asteroid_medofasteroid_smallvoor variatie in grootte en snelheid.