5. Gebeurtenissen bij een vorm
Je hebt al geleerd hoe je programma kan reageren op de gebruiker, bijvoorbeeld als die een toets indrukt. Maar wat als je wilt reageren op gebeurtenissen tussen vormen? Bijvoorbeeld, wat moet er gebeuren als twee objecten elkaar raken? Dat leer je hier!
Voor meer voorbeelden kun je altijd de cheatsheet raadplegen.
Opdracht 5.a: Reageren op een botsing
a) de basis
- Maak eerst zelf een blauwe bal, met als naam van de variabele
bal. - Maak daarna een batje met de naam
batjeen plaatst deze aan de rechterkant van het scherm.
Kijk hier voor het antwoord
import play
bal = play.new_circle(color="blue", radius=50)
batje = play.new_box(x=300)
b) Probeer nu het volgende:
- Laat de bal automatisch naar rechts bewegen
- Zorg dat de bal niet naar beneden valt
- Pas het batje aan zodat die ook niet valt en niet kan bewegen.
- Lukt het om de bal en het batje te laten botsen?
Klik hier voor een tip
Gebruik start_physics() voor laten bewegen. De eigenschappen x_speed en obeys_gravity kunnen erg nuttig zijn.
Kijk hier voor het antwoord
import play
bal = play.new_circle(color="blue", radius=50)
bal.start_physics(x_speed=40, obeys_gravity=False)
batje = play.new_box(x=300)
batje.start_physics(can_move=False, obeys_gravity=False)
play.start_program()
c) reageren op de botsing Voeg nu het volgende codefragment aan je code toe (dus tussen je code en play.start_program()):
text = play.new_text('batje is niet aangeraakt', y=200, font_size=50)
@bal.when_stopped_touching(batje)
def aangeraakt():
text.words = 'batje is aangeraakt'
5.1 Theorie: de event-decorator
Wat is die regel met de @ ervoor?
De @... regel heet een event-decorator. Deze laat de functie die er direct onder staat één keer afgaan als de specifieke gebeurtenis plaatsvindt.
De algemene vorm is:
@vorm1.when_..._touching(vorm2)
def doe_iets():
# reactie op gebeurtenis
In ons voorbeeld:
@bal.when_stopped_touching(batje)
def aangeraakt():
text.words = 'batje is aangeraakt'
Hier laat @bal.when_stopped_touching(batje) de functie aangeraakt één keer afgaan op het moment dat bal ophoudt batje te raken (dus precies bij de overgang van wel aanraken naar niet meer aanraken). De code binnen aangeraakt wordt dan uitgevoerd.
Let op:
- bal wijst hier naar de variabele
bal. Deze variabele wijst naar de gemaakte cirkel. - batje wijst hier naar de variabele
batje. Deze variabele wijst naar het gemaakte batje.
Als onze bal dus botst tegen ons batje en weer terugkaatst, vindt deze gebeurtenis plaats.