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