事件迴圈

Pygame 會將使用者的所有事件註冊到一個事件佇列中,該事件佇列可以使用程式碼 pygame.event.get() 接收。此佇列中的每個元素都是 Event 物件,它們都具有屬性 type,這是一個整數,表示它是什麼型別的事件。在 pygame 模組中,有預定義的整數常量表示型別。除此屬性外,事件具有不同的屬性。

常名 屬性
放棄 沒有
ACTIVEEVENT 獲得,狀態
KEYDOWN unicode,key,mod
KEYUP 鍵,mod
MOUSEMOTION pos,rel,buttons
MOUSEBUTTONUP pos,按鈕
MOUSEBUTTONDOWN pos,按鈕
JOYAXISMOTION 快樂,軸,價值
JOYBALLMOTION 快樂,球,相對
JOYHATMOTION 快樂,帽子,價值
JOYBUTTONUP 快樂,按鈕
JOYBUTTONDOWN 快樂,按鈕
VIDEORESIZE 大小,w,h
VIDEOEXPOSE 沒有
USEREVENT

要處理我們的事件,我們只需迴圈遍歷佇列,檢查它是什麼型別(藉助 pygame 模組中的預定義常量),然後執行一些操作。此程式碼將檢查使用者是否按下了顯示屏頂角的關閉按鈕,如果是,則終止程式。

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

注意 :使用 pygame 時,你必須定期呼叫事件佇列! 除了獲取可用事件之外,呼叫事件佇列也是 pygame 在內部與作業系統互動的方式。如果未定期呼叫事件佇列,則作業系統將假定你的程式不再正常工作,並且可能使程式看起來像程式崩潰(在 Windows 中視窗變為白色)。如果你不想對事件做任何事情,你應該在每個遊戲迴圈中呼叫 pygame.event.pump() 以使 pygame 在內部處理事件。

鍵盤事件

pygame 中有兩種型別的關鍵事件:KEYDOWNKEYUP。這些事件有一個屬性 key,它是一個表示鍵盤上鍵的整數。pygame 模組具有表示所有公共金鑰的預定義整數常量。常量以大寫 K,下劃線和鍵的名稱命名。例如, <- 名為 K_BACKSPACE,a 名為 K_a,F4 是 namned K_F4

此程式碼將檢查使用者是否已經按下 w,a,s 或 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!")

修飾符

大寫字母沒有整數常量。相反,關鍵事件有稱為 mod 另一個屬性,它是改性劑( shift,ctrl,alt 等)被同時按下的鍵。mod 屬性是一個表示被按下的修飾符的整數。每個修飾符的整數值都儲存在 pygame 模組中,名稱為 KMOD_ 及其名稱。例如,Left shift 名為 KMOD_LSHIFT,Tab 名為 KMOD_TAB,Ctrl 名為 KMOD_CTRL

此程式碼將檢查使用者按下 a,Left shift + a 或 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.")

滑鼠事件

pygame MOUSEMOTIONMOUSEBUTTONDOWNMOUSEBUTTONUP 中有三種型別的滑鼠事件。Pygame 將在設定顯示模式時註冊這些事件。

**** 當使用者在顯示器中移動他或她的滑鼠時接收 MOUSEMOTION 。它具有 buttonsposrel 的屬性。

  • buttons 是一個元組,表示滑鼠按鈕(leftmouse-wheelright)是否被按下。
  • pos 是游標的絕對位置(xy),以畫素為單位。
  • rel 是相對於前一個位置(rel_xrel_y)的位置,以畫素為單位。

**** 當使用者按下或釋放滑鼠按鈕時,接收 MOUSEBUTTONDOWNMOUSEBUTTONUP 。他們有 buttonpos 的屬性。

  • button 是一個表示按下按鈕的整數。1 表示左鍵,2 表示滑鼠滾輪,3 表示右鍵。
  • pos 是使用者按下滑鼠按鈕時滑鼠(xy)的絕對位置。

以下是使用每個滑鼠事件的一些屬性的簡短示例:

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

由於 pygame 模組中沒有滑鼠按鈕屬性的預定義常量,因此以下是每個的值:

按鍵
滑鼠左鍵 1
滑鼠滾輪按鈕 2
滑鼠右鍵 3
滑鼠滾輪向上滾動 4
滑鼠滾輪向下滾動

滾動滑鼠按鈕將生成 pygame.MOUSEBUTTONDOWNpygame.MOUSEBUTTONUP 事件。