Ga naar hoofdinhoud

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!

tip

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 batje en 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.