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).

Mulig problem på Windows

Hvis man sliter med at pgzrun ikke finnes (i pathen), kan man komme rundt dette ved å importere pgzrun og kjøre programmet med Python som vanlig:

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.