pygame
Händelsehantering
Sök…
Event loop
Pygame registrerar alla händelser från användaren i en händelsekö som kan tas emot med koden pygame.event.get()
. Varje element i denna kö är ett Event
föremål och alla kommer att ha type
, vilket är ett heltal som representerar vilken typ av händelse det är. I pygame-modulen finns fördefinierade heltalskonstanter som representerar typen. Förutom detta attribut har händelser olika attribut.
Konstant namn | attribut |
---|---|
SLUTA | ingen |
ACTIVEEVENT | vinst, stat |
NYCKEL NER | unicode, key, mod |
keyUp | nyckel, mod |
MOUSEMOTION | pos, rel, knappar |
MOUSEBUTTONUP | pos, knapp |
MOUSEBUTTONDOWN | pos, knapp |
JOYAXISMOTION | glädje, axel, värde |
JOYBALLMOTION | glädje, boll, rel |
JOYHATMOTION | glädje, hatt, värde |
JOYBUTTONUP | glädje, knapp |
JOYBUTTONDOWN | glädje, knapp |
VIDEORESIZE | storlek, w, h |
VIDEOEXPOSE | ingen |
USEREVENT | koda |
Exempel
För att hantera våra händelser går vi helt enkelt genom kön, kontrollerar vilken typ det är (med hjälp av de fördefinierade konstanterna i pygame-modulen) och utför sedan någon åtgärd. Denna kod kommer att kontrollera om användaren har tryckt på stängningsknappen i displayens övre hörn, och om så är fallet avslutar programmet.
for event in pygame.event.get():
if event.type == pygame.QUIT:
# Close the program any way you want, or troll users who want to close your program.
raise SystemExit
OBS : Du måste ringa händelsekön regelbundet när du använder pygame! Förutom att hämta de tillgängliga händelserna, är det också sättet att pygame att interagera med operativsystemet internt genom att ringa händelsekön. Om händelsekön inte kallas regelbundet antar operativsystemet att ditt program inte fungerar korrekt längre och eventuellt får det att se ut som programmet kraschade (i Windows blir fönstret vitt). Om du inte vill göra något med händelserna ska du ringa pygame.event.pump()
varje spelslinga för att få pygame att bearbeta händelserna internt.
Tangentbordshändelser
Det finns två typer av nyckelhändelser i pygame: KEYDOWN
och KEYUP
. Dessa händelser har ett attribut key
som är ett heltal som representerar en tangent på tangentbordet. Pygame-modulen har fördefinierade heltalskonstanter som representerar alla vanliga nycklar. Konstanterna namnges med en huvudstad K
, en understruk och nyckelns namn. Till exempel heter <- namnet K_BACKSPACE
, a heter K_a
och F4 heter K_F4
.
Exempel
Den här koden kommer att kontrollera om användaren har tryckt på w , a , s eller d .
for event in pygame.event.get():
if event.type == pygame.QUIT: # Usually wise to be able to close your program.
raise SystemExit
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_w:
print("Player moved up!")
elif event.key == pygame.K_a:
print("Player moved left!")
elif event.key == pygame.K_s:
print("Player moved down!")
elif event.key == pygame.K_d:
print("Player moved right!")
modifierare
Det finns ingen heltalskonstant för stora bokstäver. Istället har nyckelhändelser ett annat attribut som heter mod
, vilket är modifierarna ( skift , ctrl , alt etc.) som trycks samtidigt som tangenten. mod
är ett heltal som representerar modifieraren som trycks ned. Varje modifierares heltalvärde lagras i pygame-modulen under namnet KMOD_
och deras namn. Till exempel är vänsterskift namnges KMOD_LSHIFT
är Tab namnges KMOD_TAB
och Ctrl heter KMOD_CTRL
.
Exempel
Denna kod kommer att kontrollera om användaren har tryckt på a , Vänster skift + a eller Caps + a .
for event in pygame.event.get():
if event.type == pygame.QUIT: # It's still wise to be able to close your program.
raise SystemExit
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
if event.mod == 0: # No modifier.
print("You pressed 'a'")
elif event.mod == pygame.KMOD_LSHIFT or event.mod == pygame.KMOD_CAPS:
print("You pressed 'A'")
else:
print("You pressed 'a' with another modifier than right shift or caps.")
Mushändelser
Det finns tre typer av mushändelser i pygame MOUSEMOTION
, MOUSEBUTTONDOWN
och MOUSEBUTTONUP
. Pygame registrerar dessa händelser när ett visningsläge har ställts in.
MOUSEMOTION
emot när användaren flyttar sin mus på displayen. Den har attributen buttons
, pos
och rel
.
-
buttons
är en tupel som representerar om musknapparna (left
,mouse-wheel
,right
) trycks in eller inte. -
pos
är markörens absoluta position (x
,y
) i pixlar. -
rel
är positionen relativt den föregående positionen (rel_x
,rel_y
) i pixlar.
MOUSEBUTTONDOWN
och MOUSEBUTTONUP
emot när användaren trycker på eller släpper en musknapp. De har attribut button
och pos
.
-
button
är ett heltal som representerar knappen som trycks ned.1
för vänster knapp, 2 för mushjul och3
för höger knapp. -
pos
är musens absoluta position (x
,y
) när användaren tryckte på musknappen.
Exempel
Här är ett kort exempel med några av attributen för varje mushändelse:
for event in pygame.event.get():
if event.type == pygame.QUIT: # Close your program if the user wants to quit.
raise SystemExit
elif event.type == pygame.MOUSEMOTION:
if event.rel[0] > 0: # 'rel' is a tuple (x, y). 'rel[0]' is the x-value.
print("You're moving the mouse to the right")
elif event.rel[1] > 0: # pygame start y=0 at the top of the display, so higher y-values are further down.
print("You're moving the mouse down")
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
print("You pressed the left mouse button")
elif event.button == 3:
print("You pressed the right mouse button")
elif event.type == pygame.MOUSEBUTTONUP:
print("You released the mouse button")
Eftersom det inte finns några fördefinierade konstanter för musknappattributet i pygame-modulen, här är värdena för varje:
Knapp | Värde |
---|---|
Vänster musknapp | 1 |
Mushjulsknapp | 2 |
Höger musknapp | 3 |
Mushjulet rullar upp | 4 |
Mushjulet bläddrar nedåt | 5 |
pygame.MOUSEBUTTONDOWN
pygame.MOUSEBUTTONUP
musknappen genereras pygame.MOUSEBUTTONDOWN
och pygame.MOUSEBUTTONUP
händelser.
Statskontroll
Det är möjligt att ringa funktioner från pygame.key
och pygame.mouse
att ta emot tillståndet för tangenten och musen. Det är dock inte det rekommenderade sättet att bearbeta händelser i pygame eftersom det finns några brister i det:
Du får statusen när funktionen anropas, vilket innebär att du kan missa händelser mellan samtal om användaren trycker snabbt på knapparna.
Du kan inte bestämma ordningen på händelserna.
Du måste fortfarande ringa en av pygames händelsefunktioner för att pygame ska kunna interagera internt med operativsystemet, annars varnar det att programmet har blivit svarsfullt. Funktionerna du kan ringa är:
-
pygame.event.get()
att hämta alla händelser eller händelsetyper (genom att lämna typerna som ett argument) från kön. -
pygame.event.poll()
att få en enda händelse från kön. -
pygame.event.wait()
att vänta på en enda händelse från kön. -
pygame.event.clear()
att rensa alla händelser i kön. -
pygame.event.pump()
att låta pygame hantera interna åtgärder (kallas implicit av funktionerna ovan).
-
Tangentbordshändelser
Nyckelmodulen har en funktion pygame.key.get_pressed()
som returnerar en lista över tillståndet för alla tangenter. Listan innehåller 0
för alla knappar som inte är tryckta och 1
för alla tangenter som trycks in. Dess index i listan definieras av konstanter i pygame-modulen, alla förinställda med K_
och nyckelnamnet.
pygame.event.pump() # Allow pygame to handle internal actions.
key = pygame.key.get_pressed()
if key[pygame.K_a]:
print("You pressed 'a'")
if key[pygame.K_F1]:
print("You pressed 'F1'")
if key[pygame.K_LSHIFT]:
print("You pressed 'left shift'")
if key[pygame.K_q]: # Press 'q' to exit the program
quit()
Om du vill leta efter en enda knapptryckning istället för om tangenten hålls intryckt kan du lagra föregående tillstånd för alla knappar i en tillfällig variabel och kontrollera om värdet ändras:
pygame.event.pump() # Allow pygame to handle internal actions.
key = pygame.key.get_pressed()
if key[pygame.K_q] and not previous_key[pygame.K_q]:
print("You pressed 'q'")
if key[pygame.K_p] and not previous_key[pygame.K_p]:
print("You pressed 'p'")
previous_key = key
Uttalandet utvärderas till sant endast när den aktuella tangenten trycks ned och den föregående tangenten inte trycks ned. För att kontrollera om användaren släppte nyckeln måste du bara byta det not
nyckelordet ( if not key[pygame.K_q] and previous_key[pygame.K_q]
). För att detta ska fungera ordentligt måste du ställa in variabeln previous_key = pygame.key.get_pressed()
före spelslingan, annars får du en NameError
.
Mushändelser
Musmodulen har funktioner som låter oss kontrollera och ställa in muspositionen samt kontrollera knapparna. Funktionen pygame.mouse.get_pressed()
returnerar en tuple-tupel som representerar om musknapparna (vänster, mushjul, höger) trycks in eller inte.
pygame.event.pump() # Allow pygame to handle internal actions.
mouse_pos = pygame.mouse.get_pos()
mouse_buttons = pygame.mouse.get_pressed()
if mouse_pos[0] > 100:
pygame.mouse.set_pos(10, mouse_pos[1]) # Reset the mouse's x-position to 10.
print("YOU SHALL NOT PASS!")
if mouse_buttons[2]:
print("I'm right, right?")
if mouse_buttons[0]: # Press left mouse button to exit.
print("Program left")
quit()