Pygame 5¶
Opgave 46¶
In de onderstaande code werden de coordinaten voor de kogels vervangen door een lijst met coordinaten van kogels. Dus, we vervingen:
bullet_x
bullet_y
Door:
bullets = [ … ]
Helaas werkt onderstaande code niet meer: Het tekenen van de kogels dient aangepast te worden. Pas de code aan zodat alle kogels getoond worden. In de code zien jullie TODO staan: Deze markering geeft aan waar de aanpassing dient te komen.
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 = pygame.image.load("enemyship.png")
enemy_slain = pygame.image.load("enemyship_slain.png")
# 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 = [
[0, 0],
[103, 51],
[40, 53],
[58, 230],
]
bullet_x_change = 0
bullet_y_change = -5
# Positie van de vijand, en verplaatsing van de vijand
enemy_alive = True
enemy_x = WIDTH - 200
enemy_y = 0
enemy_x_change = 0
enemy_y_change = 1
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()
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
if enemy_alive:
# Verplaats de vijand
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)
# Dit doen we even niet, om het eenvoudiger te houden
# Teken de speler en de vijand
screen.fill("white")
screen.blit(player, (x, y))
screen.blit(enemy, (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_x, bullet_y))
pygame.display.flip()
# Wacht zodanig dat we maximal 60 FPS halen
clock.tick(60)
Link naar opgave46.py
Opgave 47¶
In de vorige opgave leerden we meerdere kogels tekenen die in een lijst opgeslagen waren. Die lijst was echter statisch: Ze werd bovenaan in het programma vastgelegd en werd niet bijgewerkt met nieuwe kogels.
Pas nu je code aan, zodat er nieuwe coordinaten in de lijst bijkomen als je schiet (als je dus op de spatiebalk drukt). Als je schiet worden de coordinaten van alle kogels op het scherm afgedrukt. Dit kan handig zijn om je code beter te begrijpen.
In de code zien jullie TODO staan: Deze markering geeft aan waar de aanpassing dient te komen.
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 = pygame.image.load("enemyship.png")
enemy_slain = pygame.image.load("enemyship_slain.png")
# 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
# De lijst is nu leeg, aangezien we het spel liefst beginnen
# zonder dat er kogels rondvliegen...
bullets = []
bullet_x_change = 0
bullet_y_change = -5
# Positie van de vijand, en verplaatsing van de vijand
enemy_alive = True
enemy_x = WIDTH - 200
enemy_y = 0
enemy_x_change = 0
enemy_y_change = 1
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
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
if enemy_alive:
# Verplaats de vijand
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)
# Dit doen we even niet, om het eenvoudiger te houden
# Teken de speler en de vijand
screen.fill("white")
screen.blit(player, (x, y))
screen.blit(enemy, (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_x, bullet_y))
pygame.display.flip()
# Wacht zodanig dat we maximal 60 FPS halen
clock.tick(60)
Link naar opgave47.py
Opgave 48¶
In de vorige opgave leerden we nieuwe kogels aan de lijst toevoegen, maar de kogels staan stil! 😒
Pas nu de code aan, zodat de coordinaten van iedere kogel bijgewerkt worden, zodat de kogels ook echt bewegen.
In de code zien jullie TODO staan: Deze markering geeft aan waar de aanpassing dient te komen.
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 = pygame.image.load("enemyship.png")
enemy_slain = pygame.image.load("enemyship_slain.png")
# 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
# De lijst is nu leeg, aangezien we het spel liefst beginnen
# zonder dat er kogels rondvliegen...
bullets = []
bullet_x_change = 0
bullet_y_change = -5
# Positie van de vijand, en verplaatsing van de vijand
enemy_alive = True
enemy_x = WIDTH - 200
enemy_y = 0
enemy_x_change = 0
enemy_y_change = 1
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
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).
if enemy_alive:
# Verplaats de vijand
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)
# Dit doen we even niet, om het eenvoudiger te houden
# Teken de speler en de vijand
screen.fill("white")
screen.blit(player, (x, y))
screen.blit(enemy, (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_x, bullet_y))
pygame.display.flip()
# Wacht zodanig dat we maximal 60 FPS halen
clock.tick(60)
Link naar opgave48.py
Opgave 49¶
Als de kogels buiten het scherm geraken, blijven ze toch in de lijst staan.
Pas de code in opgave 49 aan, zodat de kogels verwijderd worden uit de lijst zodra ze buiten het scherm geraken (y-coordinaat < 0):
if bullet[y] < 0:
# verwijder dan de kogel
Je kan deze code best toevoegen in de for-loop waar de coordinaten van de kogels bijgewerkt worden.