如何處理遊戲中的滑鼠,鍵盤事件
訂閱 480
雖然本節所提到的內容與事件有關,但擷取事件的方法,請參考如何擷取處理遊戲事件?以及建立和引發自訂事件等問題一節。
滑鼠事件
以下所提到的與滑鼠相關的事件,其所對應的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