Komme i gang med Pygame Zero

N?r man jobber med objekter og klasser kan det v?re b?de fint og motiverende ? visualisere objektene. Dette er en kjapp introduksjon til hvordan Pygame Zero kan brukes til ? visualisere et Sau-objekt. Det kan v?re lurt ? f?lge instruksene her f?r man begynner p? obligen for denne uken.

Steg 1: Installer Pygame Zero

Hvis du har Python med pip (de fleste har det automatisk i Python 3), kan du installere Pygame Zero via terminalen slik:

python3 -m pip install pgzero

Et vanlig problem p? Mac-er er at man ogs? m? installere noen biblioteker f?rst:

brew install sdl sdl_image sdl_mixer sdl_ttf portmidi;

Dette krever igjen at man har Brew installert, men det er stort sett enkelt og kjapt ? installere (se her).

Steg 2: Sjekk at installasjonen fungerer

Pygame Zero har en kommando pgzrun som vi skal kj?re i terminalen. Denne kommandoen kan kj?re et python-program, men gir det noen ekstra egenskaper som gj?r at vi blant annet kan vise et vindu p? skjermen.

Sjekk at du kan kj?re pgzrun i terminalen, og at du f?r noe slikt tilbake:

pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
Usage: pgzrun [options]

pgzrun: error: You must specify which module to run.

Steg 3: Vi lager en klasse vi vil visualisere:

Sauen v?r har et bilde (en tekstreng) og en posisjon, som vi representerer som antall pixler fra venstre side og toppen av skjermen:

class Sau():
    def __init__(self, bilde, posisjon_venstre, posisjon_topp):
        self._bilde = bilde
        self._posisjon_venstre = posisjon_venstre
        self._posisjon_topp = posisjon_topp
        self._fart_fra_venstre = 2
        self._fart_fra_topp = 2

    def beveg(self):
        self._posisjon_venstre += self._fart_fra_venstre
        self._posisjon_topp += self._fart_fra_topp

    

De to instansvariablene _fart_fra_venstre og _fart_fra_topp bruker vi for ? representere hvor mange pixler i de to retningene vi vil ha sauen skal bevege seg per tidsenhet. I stedet for km/t bruker vi her pixler/frameoppdatering, dvs pixler for hver gang skjermen oppdaterer bildet.

Metoden beveg kommer til ? bli kalt hver gang bildet skal tegnes p? skjermen, og endrer da posisjonen i henhold til farten.

Det siste vi trenger er en metode som faktisk tegner sauen p? skjermen. Legg til f?lgende metode i klassen Sau:

    def tegn(self, skjerm):
        skjerm.blit(self._bilde, (self._posisjon_venstre, self._posisjon_topp)) 

Steg 4: Litt prekode for ? f? Pygame Zero til ? virke

Sau-klassen skal n? v?re komplett, og vi trenger bare litt kode for ? fortelle Pygame Zero hva som skal skje. Lag en fil (f. eks spill.py) i samme mappe som sau.py med f?lgende innhold:

from sau import Sau

# Dette er prekode som gjoer at pygame-zero fungerer. Ikke endre dette:
WIDTH = 900
HEIGHT = 700

sau = Sau("sau", 100, 200)

# draw() er en metode Pygame Zero kaller hver gang den skal tegne noe p? skjermen (som den gj?r mange ganger i sekundet)
# Her sier vi at hver gang Pygame Zero skal tegne noe, s? vil vi at den skal kalle tegn-metoden til sauen v?r
def draw():
    # Tegn f?rst et rektangel (bakgrunnen v?r)
    screen.fill((128, 81, 9))
    # Tegn deretter sauen
    sau.tegn(screen)

# update() kalles ogs? mange ganger i sekundet. Her vil vi bevege sauen v?r
def update():
    sau.beveg()

Steg 5: Kj?r programmet!

Last ned denne sauen og lagre som sau.png i en mappe images som igjen m? ligge i samme mappe som python-filene dine.

Deretter skal det bare v?re ? skrive f?lgende i terminalen, og sauen b?r bevege seg over skjermen:

pgzrun spill.py

Lek deg gjerne med beveg-metoden til Sau for ? endre bevegelsen. Her kan man legge inn tilfeldige bevegelser f. eks.

Det g?r ogs? an ? lage flere sauer og endre draw og update til ? tegne og oppdatere alle.