Ga naar hoofdinhoud

2.3 Fysica-eigenschappen

Je hebt al geleerd hoe je vormen kunt laten bewegen en welke soorten fysica er zijn. Maar er is meer. Met eigenschappen als bounciness, mass en sensor kun je het gedrag van je vormen fijner instellen.

Bounciness (stuiteren)​

bounciness bepaalt hoe hard een vorm terugkaatst na een botsing.

  • 1.0 = de vorm kaatst net zo hard terug als dat deze aankwam (dit is het maximum)
  • 0.0 = de vorm kaatst helemaal niet terug
import play

vloer = play.new_box(y=-200, width=600, height=20)

bal = play.new_circle(y=200, radius=20)
bal.start_physics(bounciness=1.0)
Spel laden...

De bal stuitert bijna eindeloos op en neer (maar verliest heel langzaam energie).

Opdracht 2.3.a: Stuiterballen vergelijken​

Maak drie ballen naast elkaar met verschillende bounciness waarden: 0.2, 0.6 en 1.0. Laat ze allemaal vanaf dezelfde hoogte vallen op een vloer. Welke bal stuitert het hoogst?

Klik hier voor een tip.

Drie ballen betekent drie keer new_circle en drie keer start_physics. Zet ze met verschillende x-waarden naast elkaar en geef ze dezelfde y, anders vallen ze niet van dezelfde hoogte.

Klik hier voor de oplossing.
import play

vloer = play.new_box(y=-200, width=600, height=20)

bal_a = play.new_circle(x=-150, y=200, radius=20, color='red')
bal_a.start_physics(bounciness=0.2)

bal_b = play.new_circle(x=0, y=200, radius=20, color='blue')
bal_b.start_physics(bounciness=0.6)

bal_c = play.new_circle(x=150, y=200, radius=20, color='green')
bal_c.start_physics(bounciness=1.0)
Spel laden...

De groene bal (bounciness=1.0) stuitert het hoogst.

Mass (massa)​

mass bepaalt hoe "zwaar" een vorm is. Dit merk je bij botsingen: een zware vorm duwt een lichte vorm makkelijker weg.

import play

licht = play.new_circle(x=-200, radius=20, color='red')
licht.start_physics(obeys_gravity=False, x_speed=50, mass=1)

zwaar = play.new_circle(x=200, radius=40, color='blue')
zwaar.start_physics(obeys_gravity=False, x_speed=-50, mass=10)
Spel laden...

De blauwe bal (mass=10) duwt de rode bal (mass=1) makkelijk weg.

Opdracht 2.3.b: Botsende ballen​

Maak twee ballen die naar elkaar toe bewegen:

  1. Eén bal met mass=1
  2. Eén bal met mass=1

Wat gebeurt er? Verander daarna de massa van één bal naar mass=20. Wat is het verschil?

Klik hier voor een tip.

Naar elkaar toe bewegen betekent dat de een een positieve x_speed heeft en de ander een negatieve. Zet obeys_gravity=False, anders vallen ze langs elkaar heen.

Klik hier voor de oplossing.
import play

bal_a = play.new_circle(x=-200, radius=20, color='red')
bal_a.start_physics(obeys_gravity=False, x_speed=50, mass=1)

bal_b = play.new_circle(x=200, radius=20, color='blue')
bal_b.start_physics(obeys_gravity=False, x_speed=-50, mass=20)
Spel laden...

Bij gelijke massa kaatsen de ballen gelijk terug. Met ongelijke massa wordt de lichtere bal veel verder weggeduwd.

Sensor​

In 2.1 stuiterde de bal terug tegen een tekst. Elke vorm houdt andere vormen tegen, ook als je er zelf geen start_physics() op aanroept: een vierkant, een tekst, en ook een vorm met transparency=0 die je niet ziet.

Met sensor zet je dat uit. Een sensor merkt nog wel dat iets hem raakt, en when_touching gaat dan nog steeds af, maar hij houdt niets tegen. Zo maak je een scorezone, een finish, of een tekst waar de bal overheen vliegt.

  • True = de vorm is een sensor (objecten gaan er doorheen)
  • False = de vorm is normaal en blokkeert andere vormen (dit is de standaard)

Geef een sensor ook can_move=False mee. start_physics() zet anders de zwaartekracht aan, en dan valt je zone van het scherm.

import play

vloer = play.new_box(y=-200, width=600, height=20)

bal = play.new_circle(y=200, radius=20)
bal.start_physics()

zone = play.new_box(y=0, width=200, height=100, color='green', transparency=50)
zone.start_physics(can_move=False, sensor=True)

tekst = play.new_text("", y=250, font_size=30)

@bal.when_touching(zone)
def in_de_zone():
tekst.words = "In de zone!"
  1. Regel 3:

    De vloer. Deze krijgt geen start_physics(), dus hij staat stil en de bal blijft erop liggen.

  2. Regel 5-6:

    De bal, met fysica aan. Zonder die tweede regel valt hij niet.

  3. Regel 8:

    De zone. transparency=50 maakt hem half doorzichtig, zodat je kunt zien waar hij zit.

  4. Regel 9:

    De kern van dit voorbeeld: sensor=True betekent dat de zone botsingen wel merkt, maar niets tegenhoudt. Door can_move=False blijft de zone op zijn plek.

  5. Regel 11:

    Een lege tekst bovenin, klaar om straks gevuld te worden.

  6. Regel 13:

    Gaat af zolang de bal de zone raakt.

  7. Regel 15:

    Zet de melding op het scherm.

Spel laden...

De bal valt door de groene zone heen (want die is een sensor), maar de tekst verandert zodra ze elkaar raken.

Je kunt sensor ook tijdens het spel veranderen:

zone.physics.sensor = False

Er gaat iets mis: de zone valt weg​

Je zone verdwijnt onder uit het scherm, en de tekst verandert nooit.

Oorzaak: start_physics() geeft een vorm zwaartekracht, ook een sensor. De zone valt dus net zo hard als de bal, en de bal haalt hem nooit in.

Oplossing: geef can_move=False mee, dan blijft de zone staan.

# FOUT
zone.start_physics(sensor=True)

# GOED
zone.start_physics(can_move=False, sensor=True)

Opdracht 2.3.c: Scorezone​

Maak een spel met:

  1. Een vloer onderaan het scherm
  2. Een doorzichtige scorezone (gebruik sensor=True, can_move=False en transparency=50) in het midden van het scherm
  3. Een bal die van boven valt

Als de bal door de scorezone valt, laat een tekst zien: "Punt."

Klik hier voor een tip.

Gebruik @bal.when_touching(zone) om te detecteren wanneer de bal de zone raakt. De bal valt er doorheen omdat de zone een sensor is.

Klik hier voor de oplossing.
import play

vloer = play.new_box(y=-200, width=600, height=20)

zone = play.new_box(y=0, width=200, height=100, color='green', transparency=50)
zone.start_physics(can_move=False, sensor=True)

bal = play.new_circle(y=200, radius=20, color='red')
bal.start_physics()

tekst = play.new_text("", y=250, font_size=30)

@bal.when_touching(zone)
def punt():
tekst.words = "Punt."
Spel laden...

De bal valt door de groene zone en landt op de vloer. Zodra de bal de zone raakt, verschijnt "Punt.".

Waar kom je dit later weer tegen?
  • when_touching zie je terug bij 4.2 Gebeurtenissen bij een vorm om botsingen af te handelen.
  • bounciness is essentieel bij Pong (eindproject): zonder stuiterende bal is er geen spel.
  • Sensors zijn handig voor scorezones en triggers — denk aan een onzichtbaar vakje waar je een punt scoort.