Pygame 6

Stel nu dat we meerdere vijanden aan het spel willen toevoegen. We zouden net zoals voor de kogels ook een lijst kunnen gebruiken om de verschillende gegevens voor de vijanden bij te houden:

enemies = []
enemies.append([enemy_x, enemy_y])

Het probleem is echter, dat we voor de vijand meer informatie bijhouden:

  • x-positie

  • y-positie

  • of de vijand nog leeft

  • de tekening die we voor de vijand gebruiken

Voor de kogels werd het al een beetje onduidelijk welke index we moesten gebruiken om de x-coordinaat te vinden (bullet[0] of bullet[1]). Als we meer gegevens moeten bijhouden wordt dit enkel moeilijker. Stel je voor:

enemies = []
enemies.append([100, 50, 0, 5, True, enemy_alive_img])
enemies.append([50, 150, 0, 5, True, enemy_alive_img])
enemies.append([200, 70, 0, 5, False, enemy_slain_img])

enemy[1][4] # Wat is dit ook alweer? :-/

We leerden in het stukje over classes echter hoe we gegevens kunnen groeperen met functies in een class. In de oefeningen maakten jullie ook reeds een class “Enemy”. Hier gaan we nu gebruik van maken om onze code beter te structureren.

Opgave 60

Neem onderstaande code over en corrigeer de code die met “TODO” gemarkeerd werd.

import pygame
from pygame import Rect


WIDTH = 800
HEIGHT = 600

pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))

# Start de klok
clock = pygame.time.Clock()


sound = pygame.mixer.Sound("bow.wav")
explosion = pygame.mixer.Sound("explosion.wav")
player = pygame.image.load("ship.png")
bullet_img = pygame.image.load("bullet.png")
enemy_img = pygame.image.load("enemyship.png")
enemy_slain_img = pygame.image.load("enemyship_slain.png")

# TODO: voeg je Enemy clas hier toe
# class Enemy:
#    ...

# Positie van de speler, en verplaatsing van de speler
x = WIDTH / 2
y = HEIGHT - 110
xchange = 0
ychange = 0

# Posities van de kogels, en verplaatsing van de kogels
bullets = []
bullet_x_change = 0
bullet_y_change = -5

# Informatie over de vijand
enemy_alive = True
# Object dat informatie van de vijand bevat
# TODO: Corrigeer de positie van de vijand hier
enemy = Enemy(0, 0)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                sound.play()
                # TODO: Als de speler schiet,
                # voeg dan een kogel toe, op
                # de positie van de speler
                bullets.append([x, y])
                print(bullets)
            elif event.key == pygame.K_LEFT:
                xchange = -1.5
            elif event.key == pygame.K_RIGHT:
                xchange = 1.5
            elif event.key == pygame.K_UP:
                ychange = -1.5
            elif event.key == pygame.K_DOWN:
                ychange = 1.5
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                xchange = 0
            elif event.key == pygame.K_RIGHT:
                xchange = 0
            if event.key == pygame.K_UP:
                ychange = 0
            elif event.key == pygame.K_DOWN:
                ychange = 0
    # Verplaats de speler
    x += xchange
    y += ychange

    # Verplaats alle kogels
    for bullet in bullets:
        bullet[0] = bullet[0] + bullet_x_change
        # TODO: De regel hierboven zorgt voor de verplaatsing in 
        # horizontale richting (x-coordinaten). Voeg zelf de code toe voor
        # de verplaatings in vertikale richting (y-coordinaten).
        bullet[1] += bullet_y_change
        # Als de kogels rechtsbuiten het scherm gaan,
        # verwijder ze dan
        if bullet[1] < 0:
            bullets.remove(bullet)

    if enemy_alive:
        # Verplaats de vijand
        # TODO: vervang deze twee regels door gebruik te 
        # maken van je "update" method
        enemy.x += enemy.x_change
        enemy.y += enemy.y_change

        # Als de vijand buiten het scherm gaat,
        # plaats hem dan terug bovenaan het scherm
        if enemy.y > HEIGHT:
            enemy.y = 0

        # Kijk of er een botsing is
        enemy_rect = Rect(enemy.x, enemy.y, 32, 32)
        for bullet in bullets:
            bullet_rect = Rect(bullet[0], bullet[1], 8, 8)
            if enemy_rect.colliderect(bullet_rect):
                explosion.play()
                print("hit")
                enemy_alive = False
                enemy_img = enemy_slain_img
                bullets.remove(bullet)

    # Teken de speler en de vijand
    screen.fill("white")
    screen.blit(player, (x, y))
    screen.blit(enemy_img, (enemy.x, enemy.y))

    # Teken alle kogels
    for bullet in bullets:
        # gebruik blit voor iedere kogel uit de lijst
        # TODO: Corrigeer onderstaande code
        screen.blit(bullet_img, (bullet[0], bullet[1]))

    pygame.display.flip()

    # Wacht zodanig dat we maximal 60 FPS halen
    clock.tick(60)

Link naar opgave60.py

Opgave 61

Neem de code uit opgave 60 over en voeg een variabele “alive” toe aan de class Enemy, die de variabele enemy_alive vervangt.