國家檢查
可以從 pygame.key
和 pygame.mouse
模組呼叫函式來接收鍵和滑鼠的狀態。但是,這不是在 pygame 中處理事件的推薦方法,因為它存在一些缺陷:
-
呼叫該函式時,你將收到狀態,這意味著如果使用者快速按下按鈕,你可能會錯過呼叫之間的事件。
-
你無法確定事件的順序。
-
你仍然需要呼叫 pygame 的一個事件函式來進行 pygame 內部與作業系統的互動,否則它會警告程式沒有響應。你可以呼叫的功能是:
pygame.event.get()
從佇列中獲取所有事件或事件型別(通過將型別作為引數傳遞)。pygame.event.poll()
從佇列中獲取一個單一事件。pygame.event.wait()
等待佇列中的一個事件。pygame.event.clear()
清除佇列中的所有事件。pygame.event.pump()
允許 pygame 處理內部動作(由上面的函式隱式呼叫)。
鍵盤事件
金鑰模組有一個函式 pygame.key.get_pressed()
,它返回所有金鑰狀態的列表。該列表包含所有未按下的鍵的 0
和所有按下的鍵的 1
。它在列表中的索引由 pygame 模組中的常量定義,所有常量都以 K_
和鍵名為字首。
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()
如果要檢查單個按鍵而不是按住鍵,則可以將所有鍵的先前狀態儲存在臨時變數中,並檢查值是否更改:
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
僅當按下當前鍵並且未按下前一個鍵時,語句才會計算為 true。要檢查使用者是否已釋放金鑰,你只需切換 not
關鍵字(if not key[pygame.K_q] and previous_key[pygame.K_q]
)。為了使其正常工作,你必須在遊戲迴圈之前設定變數 previous_key = pygame.key.get_pressed()
,否則你將收到一個 NameError
。
滑鼠事件
滑鼠模組具有允許我們檢查和設定滑鼠位置以及檢查按下按鈕的功能。函式 pygame.mouse.get_pressed()
返回一個元組元組,表示是否按下滑鼠按鈕(左,滑鼠滾輪,右)。
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()