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)
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)
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)
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:
- Eén bal met
mass=1 - 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)
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!"
- Regel 3:
De vloer. Deze krijgt geen
start_physics(), dus hij staat stil en de bal blijft erop liggen. - Regel 5-6:
De bal, met fysica aan. Zonder die tweede regel valt hij niet.
- Regel 8:
De zone.
transparency=50maakt hem half doorzichtig, zodat je kunt zien waar hij zit. - Regel 9:
De kern van dit voorbeeld: sensor=True betekent dat de zone botsingen wel merkt, maar niets tegenhoudt. Door
can_move=Falseblijft de zone op zijn plek. - Regel 11:
Een lege tekst bovenin, klaar om straks gevuld te worden.
- Regel 13:
Gaat af zolang de bal de zone raakt.
- Regel 15:
Zet de melding op het scherm.
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:
- Een vloer onderaan het scherm
- Een doorzichtige scorezone (gebruik
sensor=True,can_move=Falseentransparency=50) in het midden van het scherm - 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."
De bal valt door de groene zone en landt op de vloer. Zodra de bal de zone raakt, verschijnt "Punt.".
when_touchingzie je terug bij 4.2 Gebeurtenissen bij een vorm om botsingen af te handelen.bouncinessis 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.