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.