4.2 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 botsingen heb je fysica nodig. In 2.2 Physics Info heb je geleerd over de drie types fysica (dynamic, static, kinematic). Dat komt hier van pas!
Voor meer voorbeelden kun je altijd de cheatsheet raadplegen.
Opdracht 4.2.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(can_move=True, obeys_gravity=False, stable=False, x_speed=40)
batje = play.new_box(x=300)
c) reageren op de botsing Voeg nu het volgende codefragment aan je code toe:
text = play.new_text('batje is niet aangeraakt', y=200, font_size=50)
@bal.when_stopped_touching(batje)
def weggekaatst():
text.words = 'bal is weggekaatst van batje'
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 weggekaatst():
text.words = 'bal is weggekaatst van batje'
Hier laat @bal.when_stopped_touching(batje) de functie weggekaatst éé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 weggekaatst 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.