Level 3PGZ - Springande strekmann

Skrevet av: Ole Andreas Ramsdal, Kodeklubben Trondheim

Oversatt av: Stein Olav Romslo

Kurs: Python
Tema: Tekstbasert, Spill, Animasjon
Fag: Programmering
Klassetrinn: 5.-7. klasse, 8.-10. klasse, Videregående skole
Bilde av BokmålPå Bokmål

Introduksjon

I denne oppgåva skal du lage eit spel der du styrer ein strekmann som hoppar over hindringar.

Illustrasjon av ferdig strekmann-spel

Steg 0: Installere Pygame Zero

For å gjere denne oppgåva må du installere Pygame Zero. Start med å sjekke at du har installert Python 3, altså at Python-versjonen din er nummerert på forma 3.X.X.

Åpne kommandolinja (engelsk: command prompt) på datamaskina di. Brukar du Windows kan du åpne start-menyen og skrive cmd (eventuelt Ledetekst, som er det norske namnet på programmet som skal køyre). På Mac og Linux åpnar du terminalvindauget. Skriv inn følgjande:

Windows og Mac:

pip install pgzero

Linux:

sudo pip install pgzero

Nokre Linux-system kallar den pip3, i så fall må du skrive det i staden for pip i koden over. Viss pip ikkje er installert kan du prøve å skrive

sudo python3 -m ensurepip

før du prøver sudo pip install pgzero att.

Steg 1: Ny fil

Start med å lage ei fil som kan køyrast med Pygame Zero.

checkSjekkliste

  • WIDTH = 550
    HEIGHT = 250
    

Steg 2: Hindringar

No skal du lage boksane som strekmannen spring mot. Dette skal du gjere ved hjelp av ei klasse.

checkSjekkliste

  • class Box:
        # Skriv eigenskapar her
    
        def draw(self):
            # Skriv koden som teiknar boksen her
    

    Tips: Bruk kommandoen screen.draw.filled_rect() for å teikne rektangel. Ein raud boks som er 50 pikslag brei og høg blir teikna oppe til venstre med:

    screen.draw.filled_rect( Rect(0, 0, 50, 50) , (255, 0, 0) )
    

    Ein blå boks nede til høgre blir:

    screen.draw.filled_rect( Rect(WIDTH-50, HEIGHT-50, 50, 50) , (0, 0, 255) )
    
  • box = Box()
    
  • def draw():
        box.draw()
    

Steg 3: Strekmann

Du skal du lage ein strekmann me kallar stick_man.

checkSjekkliste

  • stick_man = Actor('running_man')
    
  • stick_man.bottomleft = 50, HEIGHT
    
    • For at koden skal køyre må du lagre biletet av strekmannen under som running_man.png i mappa images der du har lagra run_stickman.py.
    Bilete av ein strekmann
  • Bilete av mappestrukturen

Steg 4: Funksjonane draw() og update()

Dei fleste spela i [Pygame Zero] har funksjonane [draw() (les meir)] og [update() (les meir)]. Draw-funksjonen syt for at spelvindauget blir teikna, og update-funksjonen gjer endringar i spelet før dei blir teikna med draw().

[Pygame Zero]: https://pygame-zero.readthedocs.org/ [draw() (les meir)]: https://pygame-zero.readthedocs.org/en/latest/hooks.html?highlight=draw#draw [update() (les meir)]: https://pygame-zero.readthedocs.org/en/latest/hooks.html?highlight=update#update

checkSjekkliste

  • def draw():
            screen.clear()
            screen.fill((255, 255, 255))
            stick_man.draw()
            box.draw()
    
    • Få boksen til å flytte seg mot venstre.

    • Viss boksen er ute av biletet på venstre side, flytt den til høgre side av vindauget.

    • Viss strekmannen blir treft av boksen, skriv "Du traff boksen!!" til terminalen.

    def update():
        # Flytt boksen mot venstre
    
        if "boksen er ute av biletet":
            # Flytt boksen til høgre side av biletet
    
        if "strekmannen er treft":
            print("Du traff boksen!")
    

Tips

Flytt boksen

For å få boksen til å flytte seg kan du endre x-posisjonen til boksen.

Sjekk om strekmannen blir treft

Legg merke til at y-aksen til spelvindauget er positiv nedover, motsett av det som er vanleg. Boksen sin x- og y-posisjon er der boksen sitt øvre venstre hjørne er plassert. Det er merka i biletet som (x, y).

Bilete av koordinatsystem med figurar

Den raude firkanten illustrerer kor stort biletet til strekmannen er. I tilfellet merka 1 ser du at boksen sitt øvre venstre hjørne er inni biletet til strekmannen. Dette må du sjekke i if-setninga.

I tilfelle 2 er boksen sitt øvre høgre hjørne inne i biletet til strekmannen. Det må du òg sjekke i if-setninga.

Korleis finne posisjonen til strekmannen?

  • stick_man.bottom gir posisjonen til botnen av stick_man.

  • stick_man.left gir posisjonen til venstre side av stick_man.

Steg 5: Animasjonar

No skal du gjere det mogleg for strekmannen å hoppe med mellomromtasten.

checkSjekkliste

  • def on_key_down(key):
        #(Koden din)
    

    on_key_down() (les meir) blir køyrt kvar gong spelaren trykkar på ein tast. Kva tast som blir trykka blir sendt til funksjonen som key.

  • jump_up = animate(stick_man, 'decelerate', duration=0.4, bottom=(HEIGHT - box.height*1.5))
    

    Koden fortel at:

    • Me skal lage ein animasjon med stick_man.

    • Rørsla skal vere av typen decelerate, som tyder høg hastigheit i starten, og så saktare og saktare.

    • Animasjonen skal vare i 0,4 sekund.

    • bottom av stick_man skal flyttast til HEIGHT - box.height*1.5, altså 1,5 gonger høgda til boksen.

    • Animasjonen får namnet jump_up.

  • def back_down():
        animate(stick_man, 'accelerate', duration=0.4, bottom=HEIGHT)
    

    Forstår du kva koden skal animere?

  • jump_up.on_finished = back_down
    

Tips

Dette er ei skisse for korleis koden din skal sjå ut:

def on_key_up(key):
    if ("key er mellomrom" and
        "strekmannen er på bakken"):
        # Animasjon oppover
        # Når animasjon oppover er ferdig, animer ned

def back_down():
    # Animasjon ned

Steg 6: Poeng

No skal me gi poeng etter kor mange boksar me klarar å hoppe over. Me treng to variablar, ein for poeng, og ein for å hugse om strekmannen blir treft av boksen.

checkSjekkliste

  • def update():
        global SCORE
        # reisten av koden din
    
  • screen.draw.text("Poeng: " + str(SCORE), (400, 30), color = (0, 0, 0))
    

flagTest spelet ditt

Test spelet ditt! Kor mange poeng klarar du å få?

Utfordringar

Lisens: CC BY-SA 4.0

Forbedre denne siden

Funnet en feil? Kunne noe vært bedre?
Hvis ja, vennligst gi oss tilbakemelding ved å lage en sak på Github eller fiks feilen selv om du kan. Vi er takknemlige for enhver tilbakemelding!