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

  1. Open Thonny.
  2. Download de Dojo Defender starter, pak de ZIP uit en open main.py.
  3. Klik op Run. Je ziet een donkerblauw scherm met je ruimteschip onderaan. Je kan het al bewegen met de pijltjestoetsen.
  4. 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 = False

Voeg 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 = True

Toon 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 = 0

Bij 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 = True

Laat 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 = 5

Voeg daarna een onzichtbaarheidsperiode toe zodat je niet meteen opnieuw geraakt wordt:

invincible = False
invincible_timer = 0

In update():

    if invincible:
        invincible_timer -= 1
        if invincible_timer <= 0:
            invincible = False
            ship.visible = True

Pas 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:

  1. Geluid — Voeg sounds/explosion.wav toe als een asteroïde ontploft (sounds.explosion.play()).
  2. Moeilijker — Laat asteroïden sneller vallen naarmate de score stijgt: rock.speed = random.uniform(3 + score // 10, 5 + score // 10).
  3. Power-up — Voeg een zeldzame groene power-up toe die een extra leven geeft.
  4. Kleiner — Gebruik asteroid_med of asteroid_small voor variatie in grootte en snelheid.

Download Dojo Defender