Programmeren en Wetenschappelijk Rekenen in Python
Wi1205AE I.A.M. Goddijn, Faculteit EWI
8 mei 2014
Bijeenkomst 6
Onderwerp
Tips met betrekking tot ‘debuggen’
Animaties, simulaties en spellen Pygame: de basis
Algemene tips met betrekking tot ‘debuggen’
Foutmeldingen: lees ze zorgvuldig, let op het type fout en het regelnummer (kijk niet alleen in de regel zelf maar ook in de regel daarvoor).
Voeg printopdrachten in het te onderzoeken bestand toe om te kijken of het programma doet wat je wilt.
Vraag in de ‘shell’ de waarde van variabelen op om hun laatste waarde te onderzoeken.
Simuleer in je hoofd of op papier de uitvoering van je programma.
Wetenswaardigheden over pygame
Allerlei wetenswaardigheden over pygame zijn te vinden op de volgende website:
http://pygame.org/news.html De documentatie is hier te vinden:
http://pygame.org/docs/
Voeg de laatste pagina toe aan het ‘Help menu’ in Idle (via ‘Options’).
Structuur van een programma
Vorm van een programma met pygame:
importpygameas pg
# Initialiseer pygame pg.init()
# Definieer een paar kleuren
black = (0,0,0)# RGB = red, green, blue white = (255,255,255)
... ...
# Sluit het scherm pg.quit()
Opmerkingen
Als kleur = (x , y , z) dan 0 ≤ x , y , z ≤ 255 Voor kleurcodes kun je onder andere terecht op de volgende webpagina:
http://www.helderester.nl/kleurentabel.html
Crasht een pygame programma dan moet in de ‘shell’ de opdracht:
pg.quit() worden getypt.
Huishouding!
Het is goed gebruik om de rij ‘gebeurtenissen’ te legen.
Gebeurt dat niet dan kan een programma erg traag worden door uitbundig gebruik van het computergeheugen. Dit doen we zo:
# Schoon geheugen op pg.event.pump()
We zullen later bespreken hoe we de rij ‘gebeurtenissen’
kunnen gebruiken. Bijvoorbeeld om het scherm te sluiten of een reactie van het programma op een aanslag op het toetsenbord of een muisklik.
Het maken van een tekenscherm
# Maak een scherm om op te tekenen xmax = 600
ymax = 600
reso = (xmax,ymax)
scr = pg.display.set mode(reso)
scr is nu van het type Surface, een pygame object.
Zo’n object bevat data van plaatjes, pixels met hun kleur.
Ze kunnen zijn opgeslagen in het computergeheugen of worden getoond!
Co¨ ordinaten
y loopt op van boven naar beneden!
Het laden van een plaatje
Een plaatje wordt als volgt geladen:
ufoimg = pg.image.load(“UFO.gif”)
ufogif = pg.transform.scale(ufogif,(101,59)) uforect = ufoimg.get rect( )
ufogif en ufoimg zijn van het type Surface en uforect is van het type Rect dat ook een object van pygame is.
Surface en Rect zijn belangrijke objecten van pygame
Het object Surface
Voorbeelden van van methoden (functies)
Het object Rect
Data in het object (leden)
De positie van een plaatje wordt als volgt aange- geven:
# Positie van het object ‘ufo’
xscr = xmax/2
yscr = ymax-int(float(i)/500.∗ymax) uforect.center = xscr, yscr
‘Blitting’ wat is dat?
BLIT (BLock Image Transfer) staat voor ‘bit-level block transfer’ en zorgt voor een laagdrempelig en daarom snel kopi¨eren van ‘bitmaps’. Dit gebeurt meestal door de videokaart van een computer.
Door dit te gebruiken met plaatjes die een transparante achtergrond hebben kunnen ze op verschillende posities worden getekend (na het schoonmaken van het scherm).
Hiermee wordt beweging gesimuleerd.
Er gebeurt niets totdat je ‘flipt’...
Om het resultaat van een tekening of een plaatje vanuit het geheugen naar het scherm te kopi¨eren wordt de functie flip bij de module display gebruikt.
# Plaatje is klaar, laat zien op scherm scr.display.flip( )
Wanneer een animatie wordt gemaakt moet deze opdracht in een loop worden opgenomen en wel na het maken van een tekening of een plaatje en het laden daarvan met de
‘blit’ opdracht.
Dus:
# Teken het plaatje
scr.fill(bgcolor) # Maak het scherm schoon scr.blit(ufoimg,uforect) # Blit ufo op scherm scr.display.flip( ) # Plaatje klaar
De loop, timing
De loop waardoor een plaatje beweegt ziet er zo uit:
# Start clock: get ticks is de tijd in ms., geheel getal t0 = pg.time.get ticks( )/1000.
print“Start loop”
# Loop tot ufo bovenaan scherm is whiley < 100:
pg.event.pump( )
# Bepaal tijdstap
t =pg.time.get ticks( )/1000.
dt = t − t0
# Beweeg en laad een tekening of plaatje y = y + vy ∗dt
Bewegende bitmaps
Gebruik bestanden met als extensie ‘gif’ of ‘png’ met een transparante achtergrond.
Gebruik bijvoorbeeld de gratis software paint.net of Irfanview
Zie: http://www.getpaint.net/index.html en http://www.irfanview.com/
Het toetsenbord gebruiken
Zo kan het:
whilerunning == True:
pg.event.pump( ) # Schoon geheugen op keys = pg.key.get pressed( ) # Benader toetsenbord ifkeys[pg.K LEFT]:
x = max(x − vx ∗ dt, 0.0) ifkeys[pg.K RIGHT]:
x = max(x + vx ∗ dt, 100.0) ifkeys[pg.K ESCAPE]:
running == False
Weerstand
Dx
|D| = −Vx
|V | ⇔ Dx = −|D|
|V |Vx en Dy
|D| = −Vy
|V | ⇔ Dy = −|D|
|V |Vy De weerstandskracht is tegengesteld aan de snelheid, let op het
Ballistisch probleem
Als v =
"
vx
vy
#
en C = ρ
2CDA dan is de grootte van de weerstandskracht C |v|2. e = 1
|v|
"
vx
vy
#
is de eenheidsvector in de richting van de snelheid.
Maar dan is −C |v|2e = −C |v|
"
vx
vy
#
de weerstandskracht.
Jacco Hoekstra:
Programming and Scientific Computing in Python (Version 3.10),
Artikelnummer: 0691770043.
David C. Lay:
Linear Algebra and Its Applications (fourth edition), Pearson (2013),
ISBN-13: 978-1-292-02055-6.
James Stewart:
Calculus, Early Transcedentals (seventh edition), Cengage Learning (2012),
ISBN-13: 978-0-538-49887-6.
C.Vuik, P. van Beek, F. Vermolen en J.van Kan:
Numerical Methods for Ordinary Differential Equations, VSSD (2007),