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 och 3 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()


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow