Ga naar hoofdinhoud

6.3 Animaties met async play.repeat_forever

Nu je weet hoe async en await werken, kun je ook eenvoudig animaties maken! Met @play.repeat_forever in combinatie met async kun je code steeds opnieuw laten uitvoeren.

6.3.1 Kleur laten veranderen

import play

bal = play.new_circle(color='red')

@play.repeat_forever
async def verander_kleur():
bal.color = 'orange'
await play.timer(seconds=0.5)
bal.color = 'yellow'
await play.timer(seconds=0.5)
bal.color = 'green'
await play.timer(seconds=0.5)
bal.color = 'blue'
await play.timer(seconds=0.5)
bal.color = 'purple'
await play.timer(seconds=0.5)
bal.color = 'red'
await play.timer(seconds=0.5)

play.start_program()

De bal verandert nu steeds van kleur: rood → oranje → geel → groen → blauw → paars → rood, enzovoort!

Hoe werkt dit?

@play.repeat_forever
async def verander_kleur():

Deze functie wordt steeds opnieuw uitgevoerd, totdat het programma stopt. Door async ervoor te zetten kan de functie wachten zonder het hele spel te pauzeren.

    bal.color = 'orange'

We veranderen de kleur van de bal naar oranje door simpelweg een nieuwe waarde toe te wijzen.

    await play.timer(seconds=0.5)

We wachten 0.5 seconden voordat we de volgende kleur instellen. Dit blijft maar herhalen!

6.3.2 Opdracht: Wissel tussen animaties

Maak een programma waarbij je met de pijltjestoetsen kunt wisselen tussen twee verschillende animaties.

  • Druk op de linker pijltjestoets → de bal verandert van kleur
  • Druk op de rechter pijltjestoets → de bal wordt groter en kleiner

Stappenplan:

  1. Maak een global variabele animatie met de waarde 'kleur'
  2. Maak een functie met @play.when_key_pressed('left') die animatie naar 'kleur' zet
  3. Maak een functie met @play.when_key_pressed('right') die animatie naar 'grootte' zet
  4. Maak een @play.repeat_forever async functie die:
    • Met een if animatie == 'kleur': controleert of de kleuranimatie moet draaien
    • Met een if animatie == 'grootte': controleert of de grootteanimatie moet draaien
Klik hier voor de oplossing
import play

bal = play.new_circle(color='red', radius=50)
animatie = 'kleur'

@play.when_key_pressed('left')
def kies_kleur():
global animatie
animatie = 'kleur'

@play.when_key_pressed('right')
def kies_grootte():
global animatie
animatie = 'grootte'

@play.repeat_forever
async def animeer():
if animatie == 'kleur':
bal.color = 'orange'
await play.timer(seconds=0.5)
bal.color = 'yellow'
await play.timer(seconds=0.5)
bal.color = 'green'
await play.timer(seconds=0.5)
bal.color = 'blue'
await play.timer(seconds=0.5)
bal.color = 'red'
await play.timer(seconds=0.5)

if animatie == 'grootte':
bal.radius = 60
await play.timer(seconds=0.3)
bal.radius = 70
await play.timer(seconds=0.3)
bal.radius = 60
await play.timer(seconds=0.3)
bal.radius = 50
await play.timer(seconds=0.3)

play.start_program()