Programmeren en Wetenschappelijk Rekenen in Python Wi1205AE, 8 mei 2014
Bijeenkomst 6 Onderwerp Tips met betrekking tot debuggen Animaties, simulaties en spellen Pygame: de basis 8 mei 2014 1
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. 8 mei 2014 2
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 ). 8 mei 2014 3
Structuur van een programma Vorm van een programma met pygame: import pygame as 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() 8 mei 2014 4
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. 8 mei 2014 5
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. 8 mei 2014 6
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! 8 mei 2014 7
Coördinaten y loopt op van boven naar beneden! 8 mei 2014 8
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 8 mei 2014 9
Het object Surface Voorbeelden van van methoden (functies) 8 mei 2014 10
Het object Rect Data in het object (leden) De positie van een plaatje wordt als volgt aangegeven: # Positie van het object ufo xscr = xmax/2 yscr = ymax-int(float(i)/500. ymax) uforect.center = xscr, yscr 8 mei 2014 11
Blitting wat is dat? BLIT (BLock Image Transfer) staat voor bit-level block transfer en zorgt voor een laagdrempelig en daarom snel kopiëren 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. 8 mei 2014 12
Er gebeurt niets totdat je flipt... Om het resultaat van een tekening of een plaatje vanuit het geheugen naar het scherm te kopiëren 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. 8 mei 2014 13
Dus: # Teken het plaatje scr.fill(bgcolor) scr.blit(ufoimg,uforect) scr.display.flip( ) # Maak het scherm schoon # Blit ufo op scherm # Plaatje klaar 8 mei 2014 14
De loop, timing 8 mei 2014 15
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 while y < 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 8 mei 2014 16
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/ 8 mei 2014 17
Het toetsenbord gebruiken Zo kan het: while running == True: pg.event.pump( ) # Schoon geheugen op keys = pg.key.get pressed( ) # Benader toetsenbord if keys[pg.k LEFT]: x = max(x vx dt, 0.0) if keys[pg.k RIGHT]: x = max(x + vx dt, 100.0) if keys[pg.k ESCAPE]: running == False 8 mei 2014 18
Weerstand D x D = V x V D x = D V V x en D y D = V y V D y = D V V y De weerstandskracht is tegengesteld aan de snelheid, let op het min-teken! 8 mei 2014 19
Ballistisch probleem Als v = [ vx v y ] en C = ρ 2 C D A dan is de grootte van de weerstandskracht C v 2. [ ] e = 1 vx is de eenheidsvector in de richting van de v snelheid. v y Maar dan is C v 2 e = C v [ vx v y ] de weerstandskracht. 8 mei 2014 20
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), ISBN-13: ISBN 978-90-6562-156-6. 8 mei 2014 20