如何處理遊戲中的滑鼠,鍵盤事件
訂閱 375
雖然本節所提到的內容與事件有關,但擷取事件的方法,請參考如何擷取處理遊戲事件?以及建立和引發自訂事件等問題一節。
滑鼠事件
以下所提到的與滑鼠相關的事件,其所對應的Event
物件均擁有touch
變數,如果該變數為True
,則表示事件是由觸控行為引發。
Pygame 處理滑鼠按鍵的按下和放開事件影片示範 YouTube
pygame
模組擁有變數MOUSEBUTTONUP
和MOUSEBUTTONDOWN
,他們分別表示按下滑鼠按鍵和放開滑鼠按鍵的事件,而以上兩個事件所對應Event
物件擁有以下變數。
- pos 變數
pos
變數是一個形式類似於(x,y)
的 Python 整數元組,該元組表示按鍵被按下或放開時,滑鼠在視窗中的相對位置(左上角為原點),其中x
表示滑鼠的 X 座標,y
表示滑鼠的 Y 座標。- button 變數
button
變數是表示滑鼠按鍵的整數。你可以從pygame
模組中匯入以BUTTON_
開頭的變數,並將這些變數與button
變數進行比較,以判斷玩家按下或放開了哪個滑鼠按鍵。其中,BUTTON_LEFT
對應滑鼠左按鍵,BUTTON_RIGHT
對應滑鼠右按鍵,BUTTON_MIDDLE
對應滑鼠滾輪鍵,BUTTON_WHEELUP
對應滑鼠滾輪鍵向上捲動,BUTTON_WHEELDOWN
對應滑鼠滾輪鍵向下捲動。
Pygame 處理滑鼠移動事件影片示範 YouTube
pygame
模組擁有變數MOUSEMOTION
,他表示滑鼠被移動的事件,該事件所對應Event
物件擁有以下變數。
- pos 變數
pos
變數是一個形式類似於(x,y)
的 Python 整數元組,該元組表示按鍵被按下或放開時,滑鼠在視窗中的相對位置(左上角為原點),其中x
表示滑鼠的 X 座標,y
表示滑鼠的 Y 座標。- rel 變數
rel
變數是一個形式類似於(x,y)
的 Python 整數元組,他表示了與上一次事件相比,滑鼠的移動距離,其中x
表示水平移動距離(正數表示向右移動,負數表示向左移動),y
表示垂直移動距離(正數表示向下移動,負數表示向上移動)。- buttons 變數
buttons
變數是一個形式類似於(l,m,r)
的 Python 整數元組,他表示在滑鼠移動時滑鼠按鍵是否被按下(整數1
表示按鍵被按下,整數0
表示按鍵未被按下),其中l
對應了滑鼠左按鍵,m
對應了滑鼠滾輪按鍵,r
對應了滑鼠右按鍵。
pygame
模組擁有變數MOUSEWHEEL
,他表示捲動滑鼠滾輪按鍵的事件,該事件所對應Event
物件擁有以下變數。
- precise_x,precise_y 變數
precise_x
是表示滑鼠滾輪在水平方向捲動量的浮點數(正數表示向右捲動,負數表示向左捲動),precise_y
是表示滑鼠滾輪在垂直方向捲動量的浮點數(正數表示向上捲動,負數表示向下捲動)。- x,y 變數
Pygame 官方並未解釋
x
和y
變數的作用,但他們可能與precise_x
,precise_y
類似,同樣表示滑鼠滾輪的捲動量,只不過其型別是整數而非浮點數。- flipped 變數
如果
flipped
變數為True
,則x
,y
,precise_x
,precise_y
變數的值相反(Pygame 官方未做進一步的解釋)。
滑鼠
除了通過事件,你也可以使用mouse
模組來實作與滑鼠相關的功能,具體請檢視如何取得和設定滑鼠的資訊和狀態(位置,移動距離,按鍵狀態,指標可見性等)一節。
在下面的範例中,我們簡單的顯示了不同滑鼠事件的訊息。
# 匯入相關模組,並建立遊戲視窗
from pygame import display, event
w = display.set_mode((400, 300))
# 匯入與滑鼠事件相關的變數
from pygame import MOUSEBUTTONDOWN, MOUSEBUTTONUP, MOUSEMOTION, MOUSEWHEEL
running = True
while running:
for e in event.get():
# 顯示不同滑鼠事件的資訊
if e.type == MOUSEBUTTONDOWN:
print('按下滑鼠', e)
elif e.type == MOUSEBUTTONUP:
print('放開滑鼠', e)
elif e.type == MOUSEMOTION:
print('移動滑鼠', e)
elif e.type == MOUSEWHEEL:
# 當玩家捲動滾輪時,結束遊戲迴圈
print('捲動滾輪', e)
running = False
鍵盤事件
Pygame 處理鍵盤按鍵的按下和放開事件影片示範 YouTube
pygame
模組擁有變數KEYDOWN
和KEYUP
,他們分別表示按下鍵盤按鍵和放開鍵盤按鍵的事件,而以上兩個事件所對應Event
物件擁有以下變數。
- key 變數
key
變數是一個整數(按鍵 ID),用於表示所按下或放開的鍵盤按鍵(不區分字母大小寫)。你可以從pygame
模組中匯入以K_
開頭的變數(比如K_w
),並將這些變數與key
變數進行比較,以判斷玩家是否按下或放開了某個按鍵。- mod 變數
mod
變數是一個整數,用於表示鍵盤輔助按鍵的狀態。你可以從pygame
模組中匯入以KMOD_
開頭的變數(比如KMOD_RCTRL
),並通過&
運算mod
和這些變數,以判斷玩家是否按下或放開了某個輔助按鍵(如果運算結果不為0
則表示按下了對應的輔助按鍵)。- unicode 變數
unicode
變數是一個字串,表示按下或放開的鍵盤按鍵所產生的字元(區分字母大小寫)。- scancode 變數
scancode
變數一個表示物理按鍵掃描碼的整數,對應了所按下或放開的鍵盤按鍵。你可以從pygame
模組中匯入以KSCAN_
開頭的變數(比如KSCAN_0
),並將這些變數與scancode
變數進行比較,以判斷玩家是否按下或放開了某個具體的物理按鍵。
pygame
模組擁有變數KEYMAPCHANGED
,他表示按鍵對映被改變的事件,該事件可能是由於系統的語言或鍵盤的布局發生變化而引發的。
鍵盤按鍵被按下的事件不會被持續引發
在 Pygame 中,鍵盤按鍵被按下的事件不會被持續引發,即便將某個鍵盤按鍵保持按下狀態,按鍵按下的事件也僅會引發一次,除非使用key
模組的set_repeat
函式,設定了鍵盤的重複狀態。
鍵盤
要想了解key
模組或該模組的set_repeat
函式,請檢視如何取得和設定鍵盤的資訊和狀態(按鍵狀態,重複狀態等)一節,取得和設定鍵盤按鍵的重複狀態一段。
在下面的範例中,當玩家按下方向鍵時,將顯示不同的訊息,當玩家按下右Ctrl鍵時,遊戲迴圈將結束。
這裏需要指出,在執行範例時,請確保輸入法為英文,否則相關的鍵盤事件可能不會被引發。
# 匯入相關模組,並建立遊戲視窗
from pygame import display, event
w = display.set_mode((400, 300))
# 匯入與鍵盤事件相關的變數
from pygame import KEYDOWN, KEYUP, KEYMAPCHANGED, K_UP, K_DOWN, K_LEFT, K_RIGHT, KMOD_RCTRL
running = True
while running:
for e in event.get():
if e.type == KEYDOWN:
print('按下鍵盤', e)
# 判斷按下的鍵是哪一個
if e.key == K_UP:
print('上方向鍵')
elif e.key == K_DOWN:
print('下方向鍵')
elif e.key == K_LEFT:
print('左方向鍵')
elif e.key == K_RIGHT:
print('右方向鍵')
if e.mod & KMOD_RCTRL:
# 按下右 Ctrl 鍵,則結束遊戲迴圈
running = False
elif e.type == KEYUP:
print('放開鍵盤', e)
elif e.type == KEYMAPCHANGED:
print('鍵盤布局改變', e)
原始碼
src/zh-hant/event/mouse_and_keyboard·codebeatme/pygame·GitHub
講解影片
Pygame 處理滑鼠按鍵的按下和放開事件·YouTube
Pygame 處理滑鼠移動事件·YouTube
Pygame 處理鍵盤按鍵的按下和放開事件·YouTube