Pygame Basics

Pygame er eit bibliotek som kan brukast til spill (naturlig nok) og andre program som krever grafikk og bevegelse. Det fins andre blibliotek, som kanskje gir oss større muligheter, og hvis du skal laga animasjonar med mange objekt som beveger seg, så bør du kanskje gjera det objektorientert.

Den offisielle webstaden for Pygame er www.pygame.org.  Pygame er ikkje innebygd i Anaconda/Spyder, så det må installerast vha programmet pip.exe. Du må først finna ut kor det er på maskinen din. Det kan feks. liggja på C:\Users\<din brukar>\AppData\Local\Continuum\anaconda3\Scripts. programmet Ledetektst og flytt til den mappa som pip ligg på vha. kommandoen cd <mappenavn>. (cd står for change directory). Så kan du installera pygame med kommandoen

"pip install pygame"

Deretter kan du gjerne testa at pygame funkar ved å gå til konsollet i Spyder og skriva run -m pygame.examples.aliens. Hvis du no ser ein gjeng med flygande tallerkenar fly over skjermen, er du klar til å programmera :)

Komma i gang

Vi skal no sjå på ein del vanlig kode som du vil finna i alle pygameprogram, og som vil gjera deg i stand til å laga mange typar animasjonar. Det einaste som kanskje burde vore med, er kommandoar som blit som lar oss visa eit bilde (det kan feks. vera ein figur eller ein bakgruunn) i vinduet vårt, Men eg ser på det som meir spill-funksjonalitet, og her har vi fokus på fysikk-simuleringar, og då vil det ofte halda å tegna sirklar og rektangel.

Så då går vi i gang. Det første vi må gjera i koden vår, er å importera og initialisera pygame:

import pygame

pygame.init()

Opna eit vindu

For å opna eit vindu på  400 x 300 px, kan vi skriva:

vindu = pygame.display.set_mode((400,300))

For vårt nyopna vindu gjeld følgande:

Definera fargar

Det er lurt å definera alle fargar som du har tenkt å bruka slik:

farge = (r,g,b)

Eksempel: (eg bruker vanligvis store bokstavar for konstantar, men det er ikkje nødvendig)

SVART = (0,0,0)
KVIT = (255,255,255)
RAUD = (255,0,0) GROEN = (0,255,0) BLAA = (0,0,255) ROSA = (255,200,200)
Prøv denne RGB-utforskaren for å laga andre fargar.

Tegna figurar

Pygame har mange funksjonar for å fargeleggja og tegna ting i vinduet. Merk at for at disse skal visast må du  pygame.display.update(). Meir om dette under. Eksempel på kommandoer du kan bruka er:

vindu.fill(farge)
pygame.draw.line(vindu, farge, startpunkt, sluttpunkt, tykkelse)

Vi kan også tegna samanhengande linjer med følgande kommando:

pygame.draw.lines(vindu, farge, lukka, punktliste, tykkelse) 
pygame.draw.rect(vindu, farge, (x,y,bredde,høgde), tykkelse)
pygame.draw.circle(vindu, farge, (x,y), radius, tykkelse)

Visa bilder

Pygame har nyttige funksjonar som lar oss visa bilder i ulike format som PNG, JPG, GIF, og BMP. Først må vi lasta fila:

bilde = pygame.image.load(bildefil)

Hvis figuren har feil størrelse, så kan vi skalera den opp eller ned vha. funksjonen pygame.transform.scale:

bilde = pygame.transform.scale(image, (bredde, høyde))

Det fins også andre nyttige funksjonar som forandrar bildet, som feks pygame.transform.rotate og pygame.transform.flip som hhv. roterer og speiler bildet. Det neste som må skje er at vi kopierer bilde til vinduet vårt med funksjonen blit:

vindu.blit(bilde, (x,y))

Merk at det er mulig å gi (x,y) både som negative verdiar og verdiar som ligg utanfor vindu, så her må du passa på. Det er også mulig å lima same bilde inn fleire stader i same vindu.

Det fins også andre funksjonar for å tegna og manipulera bilder.

Oppdatering av skjermen

Dei du gjer i vinduet, som å fylla det med ein farge, eller å tegna ein figur, visest ikkje med ein gong. For å få det til må du bruka denne funksjonen:

pygame.display.update()

Lukking av vindu med quit-knappen (raud X i Windows, raud sirkel på Mac)

For å få dette til må vi gjera to ting:

  1. Laga ein uendelig loop, som ser etter event, dvs. om brukar har trykt ein tast, brukt musa eller liknande.
  2. Ein kode som  sjekkar om vi har fått eit QUIT event, og håndterer dette.
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

Denne koden gjer følgande:

Eksempel på program som lagar enkle figurar.

Animasjonar

For å få td. ein figur til å bevega seg, må du ha kode innanfor ei løkke som:

Få bevegelsen til å gå fortare eller saktare

Hvis programmet ditt er kjapt kan du oppleva at animasjonen din går veldig fort. Men det er minst to måtar du kan styra hastigheten.

Du kan for eksempel skriva til pygame.time.delay(5)inne i løkka. Dette får programmet til å venta 5 millisekunder.

Ein betre måte er å bruka ei klokke:

  1. Putt koden clock = pygame.time.Clock() nær starten på programmet. Den må vera etter pygame.init() men utanfor hovedløkka.
  2. Inne i løkka puttar du feks. koden clock.tick(30) der 30 gir deg 30 oppdateringar i sekunder (frames per second)

Men så er det også slik at når vi simulerer fysiske system, så har vi ein parameter dt (eller liknande) som bestemmer kor ofte (i verkelig tid) vi skal rekna ut og visa ny posisjon. Hvis animasjonen går for fort, så kan vi mykje heller minka dt. Fordelen med denne tilnærminga er at simuleringen vår blir meir nøyaktig. I mange eksperiment er nok heller problemet at for å få stor nok nøyaktighet, så vil animasjonen går veldig seint. Til dette er det å sei, at for alle applikasjonar som skal ha så stor nøyaktighet som mulig, så vil vi 1) ikkje bruka animasjonar 2) ikkje bruka Eulermetoden ,og 3) antagelig heller ikkje bruka Python, men kanskje C++, eller andre språk som kjører fortare. Det som Python + Pygame er så bra til, er å læra å laga simuleringar gjennom prøving og feiling, og at disse er interaktive, slik at brukaren kan leika og læra.


LENKER