事件迴圈
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 中有兩種型別的關鍵事件:KEYDOWN
和 KEYUP
。這些事件有一個屬性 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 MOUSEMOTION
,MOUSEBUTTONDOWN
和 MOUSEBUTTONUP
中有三種型別的滑鼠事件。Pygame 將在設定顯示模式時註冊這些事件。
**** 當使用者在顯示器中移動他或她的滑鼠時接收 MOUSEMOTION
。它具有 buttons
,pos
和 rel
的屬性。
buttons
是一個元組,表示滑鼠按鈕(left
,mouse-wheel
,right
)是否被按下。pos
是游標的絕對位置(x
,y
),以畫素為單位。rel
是相對於前一個位置(rel_x
,rel_y
)的位置,以畫素為單位。
**** 當使用者按下或釋放滑鼠按鈕時,接收 MOUSEBUTTONDOWN
和 MOUSEBUTTONUP
。他們有 button
和 pos
的屬性。
button
是一個表示按下按鈕的整數。1
表示左鍵,2 表示滑鼠滾輪,3
表示右鍵。pos
是使用者按下滑鼠按鈕時滑鼠(x
,y
)的絕對位置。
例
以下是使用每個滑鼠事件的一些屬性的簡短示例:
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.MOUSEBUTTONDOWN
和 pygame.MOUSEBUTTONUP
事件。