Ga naar hoofdinhoud

10.6 Tekst die verandert

Online speeltuin

De voorbeelden in dit hoofdstuk draaien niet in de online speeltuin. Een pygame-ce-programma schrijft zijn eigen game-loop, en die is in de browser niet meer te stoppen. Draai ze op je eigen computer, in Thonny of VS Code — zie installatie.

In de vorige les heb je geleerd hoe je tekst op het scherm toont. Maar wat als de tekst moet veranderen, bijvoorbeeld een score die omhoog gaat?

KEYDOWN: reageren op een toetsdruk​

In les 10.4 gebruikten we pygame.key.get_pressed() om continu te checken of een toets ingedrukt is. Maar soms wil je dat iets één keer gebeurt per toetsdruk. Hiervoor gebruik je pygame.KEYDOWN in de event loop:

for event in pygame.event.get():
if event.type == pygame.QUIT:
actief = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
print("Spatie ingedrukt!")
info

Het verschil: pygame.key.get_pressed() checkt continu of een toets ingedrukt is (handig voor beweging). pygame.KEYDOWN detecteert het moment dat een toets wordt ingedrukt (handig voor een score verhogen).

Een score bijhouden​

Je kunt tekst elke frame opnieuw renderen met een variabele:

import pygame

pygame.init()

scherm = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
font = pygame.font.SysFont("arial", 40)

score = 0

actief = True

while actief:
for event in pygame.event.get():
if event.type == pygame.QUIT:
actief = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
score = score + 1

scherm.fill((30, 30, 30))

tekst = font.render("Score: " + str(score), True, (255, 255, 255))
scherm.blit(tekst, (300, 280))

pygame.display.flip()
clock.tick(60)

pygame.quit()

Elke keer dat je op spatie drukt, gaat de score omhoog. De tekst wordt elk frame opnieuw getekend met de nieuwe waarde van score.

Opdracht 10.6.a: Scoreteller​

Maak een programma waarbij:

  1. Een score begint op 0
  2. Met pijltje omhoog gaat de score omhoog
  3. Met pijltje omlaag gaat de score omlaag
  4. De score wordt op het scherm getoond
Klik hier voor een tip.

De score verandert, dus je moet de tekst elk frame opnieuw maken met font.render(...). Reageren op de pijltjes doe je in de event-lus, met event.type == pygame.KEYDOWN.

Klik hier voor de oplossing.
import pygame

pygame.init()

scherm = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
font = pygame.font.SysFont("arial", 50)

score = 0

actief = True

while actief:
for event in pygame.event.get():
if event.type == pygame.QUIT:
actief = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
score = score + 1
if event.key == pygame.K_DOWN:
score = score - 1

scherm.fill((30, 30, 30))

tekst = font.render("Score: " + str(score), True, (255, 255, 255))
scherm.blit(tekst, (300, 280))

pygame.display.flip()
clock.tick(60)

pygame.quit()