Skapa ett spel med Pygame – tangenttryckningar

Pygame kan läsa av events från användaren, exempelvis tangenttryckningar. Vi kan alltså låta saker hända, beroende vilken knapp på tangentbordet man trycker på. 

I föregående avsnitt visade vi hur man kan skapa en game-loop för att skapa basen för ett spel i pygame. Vi ska nu fortsätta genom att kunna styra spelaren med piltangenterna. Vi utgår från game-loopen vi skapade i föregående avsnitt:

# 1: Importa biblioteket pygame
import pygame
from pygame.locals import *

# 2: initiera pygame-modulen 
pygame.init()
pygame.font.init()

# 3: Bestäm storleken på spelplanen
width, height = 64*10, 64*8
screen=pygame.display.set_mode((width, height))

# 4: Skapa x och y position för spelaren
player_x = 200
player_y = 200

# 5: Ladda in bilder
player = pygame.image.load("hero.png")

# 6: Skapa en evighetsloop som aldrig tar slut
while 1:
    # 7: Rita ut en vit spelplan
    screen.fill((255,255,255))

    # 8: Rita ut bilden player på en x, y koordinat
    screen.blit(player, (player_x, player_y))

    # 9: Updatera spelplanen
    pygame.display.flip()

    # 10: Gå igenom alla nya event 
    for event in pygame.event.get():
        # Kolla om spelplanen stängs ner. I så fall, stäng av programmet
        if event.type == pygame.QUIT:
            # if it is quit the game
            pygame.quit() 
            exit(0)

Hur använder man tangenttryckningar i PyGame?

Vi har redan visat hur pygame har inbyggda funktioner för att läsa av event (pygame.event.get() ). Denna funktion kan även känna av tangenttryckningar. Vi börjar med att skapa en array som hanterar de fyra piltangenterna:

keys = [False, False, False, False]

Där indexen är är ordnade enligt [upp, vänster, ner, höger]. False innebär att tangenten inte är nedtryckt och True betyder att tangenten är nedtryckt. Exempelvis betyder:

keys = [False, True, False, False]

att vänster piltangent är nedtryckt och alla andra är släppta.

Vi kan nu använda oss av pygames event-funktion för att avgöra om en tangent är nedtryckt eller släppt

if event.type == pygame.KEYDOWN:  #  Avgör om en tangent har trycks ner
 if event.type == pygame.KEYUP:  #  Avgör om en tangent har släppts

Vi kan använda dessa två kommandon och uppdatera arrayen varje gång rätt tangent trycks ner:

if event.type == pygame.KEYDOWN:
    if event.key==K_UP:
        keys[0]=True
    elif event.key==K_LEFT:
        keys[1]=True
    elif event.key==K_DOWN:
        keys[2]=True
    elif event.key==K_RIGHT:
        keys[3]=True

Det vill säga, när en tangent blir nedtryckt, sätter vi True på den plats i arrayen som tangenten tillhör.

På samma sätt avgör vi om en tangent släpps och sätter dess plats till False:

if event.type == pygame.KEYUP:
    if event.key==pygame.K_UP:
        keys[0]=False
    elif event.key==pygame.K_LEFT:
        keys[1]=False
    elif event.key==pygame.K_DOWN:
        keys[2]=False
    elif event.key==pygame.K_RIGHT:
        keys[3]=False

Vi kan nu uppdatera positionen på spelaren genom att kolla om tangenknappen är nedtryckt eller inte. Först hanterar vi y-positionen:

# Updatera y-positionen
if keys[0]:                        # Om uppåtknappen är intryckt
    if player_y > 0:               # Om koordinaten är större än 0 (ej utanför spelplanen)
        player_y -= 15             # Ändra y-positionen med 15 pixlar. Spelaren åker uppåt
elif keys[2]:                      # Om nedåttangenten är intryckt
    if player_y < height-64:       # Om koodinaten är mindre än höjden på spelplanen (ej utanför spelplanen)
        player_y += 15             # Ändra y-positionen med 15 pixlar. Spelaren åker nedåt

Sedan x-positionen på motsvarande sätt:

if keys[1]:                       # Om vänster tangent är nedtryckt
    if player_x > 0:              # Om spelaren är innanför spelplanen
        player_x -= 15            # Minska positionen i x-led. Spelaren åker vänster
elif keys[3]:                     # Om höger tangent är nedtryckt
    if player_x < width-64:       # Om spelaren är innanför spelplanen
        player_x += 15            # Öka positionen i x-led. Spelaren åker höger

Kör vi spelet nu, kommer vi kunna styra spelaren med piltangenterna:

Testa själv! Här är all kod!

# 1 - Import library
import pygame
from pygame.locals import *

# 2 - Initialize the game
pygame.init()
pygame.font.init() # you have to call this at the start, 
                   # if you want to use this module.

width, height = 64*10, 64*8
screen=pygame.display.set_mode((width, height))
player_x = 200
player_y = 200
keys = [False, False, False, False]

# 3 - Load images
player = pygame.image.load("hero.png")

# 4 - keep looping through
while 1:

    # 5 - clear the screen before drawing it again
    screen.fill((255,255,255))
    # 6 - draw the screen elements
    screen.blit(player, (player_x, player_y))

    # 7 - update the screen
    pygame.display.flip()
    # 8 - loop through the events
    for event in pygame.event.get():
        # check if the event is the X button 
        if event.type == pygame.QUIT:
            # if it is quit the game
            pygame.quit() 
            exit(0) 
        if event.type == pygame.KEYDOWN:
            if event.key==K_UP:
                keys[0]=True
            elif event.key==K_LEFT:
                keys[1]=True
            elif event.key==K_DOWN:
                keys[2]=True
            elif event.key==K_RIGHT:
                keys[3]=True

        if event.type == pygame.KEYUP:
            if event.key==pygame.K_UP:
                keys[0]=False
            elif event.key==pygame.K_LEFT:
                keys[1]=False
            elif event.key==pygame.K_DOWN:
                keys[2]=False
            elif event.key==pygame.K_RIGHT:
                keys[3]=False

    # Updatera y-positionen
    if keys[0]:                        # Om uppåtknappen är intryckt
        if player_y > 0:               # Om koordinaten är större än 0 (ej utanför spelplanen)
            player_y -= 15             # Ändra y-positionen med 15 pixlar. Spelaren åker uppåt
    elif keys[2]:                      # Om nedåttangenten är intryckt
        if player_y < height-64: # Om koodinaten är mindre än höjden på spelplanen (ej utanför spelplanen) player_y += 15 # Ändra y-positionen med 15 pixlar. Spelaren åker nedåt if keys[1]: # Om vänster tangent är nedtryckt if player_x > 0:               # Om spelaren är innanför spelplanen
            player_x -= 15             # Minska positionen i x-led. Spelaren åker vänster
    elif keys[3]:                      # Om höger tangent är nedtryckt
        if player_x < width-64:        # Om spelaren är innanför spelplanen
            player_x += 15             # Öka positionen i x-led. Spelaren åker höger
Bakåt    |    Framåt