如何取得和設定鍵盤的資訊和狀態(按鍵狀態,重複狀態等)
訂閱 375
本節內容不涉及鍵盤事件的講解,要了解如何處理鍵盤事件,請檢視如何處理遊戲中的滑鼠,鍵盤事件一節。
Pygame 中的 key 模組
Pygame 的key
模組,提供了一些與鍵盤相關的函式,可以幫助開發者取得或設定鍵盤的資訊和狀態,比如,鍵盤按鍵的按下狀態。當然,在處理與鍵盤相關的事件時,鍵盤的資訊也可能會由Event
事件物件提供。
請確保 Pygame 能夠自行處理事件
如果希望key
模組中的函式能夠正常工作,那麽應在遊戲迴圈中呼叫event
模組的pump
函式,該函式能夠讓 Pygame 自行處理事件。當然,event
模組的某些函式會隱含的呼叫pump
,比如get
函式(當其參數pump
為True
時)。
事件
關於如何讓 Pygame 自行處理事件,請檢視讓 Pygame 自行處理事件佇列中的事件一段。
取得鍵盤按鍵的按下狀態
Pygame 取得鍵盤按鍵(組合)的按下狀態影片示範 YouTube
key
模組的get_pressed
函式,可取得鍵盤上所有按鍵的按下狀態,通常用於判斷某個按鍵是否被按下,或某些按鍵是否被一同按下。
get_pressed()
- 傳回值
get_pressed
函式傳回一個型別為ScancodeWrapper
的物件(類別ScancodeWrapper
屬於模組key
),你可將該物件簡單的視為一個布林型別的元組。通過從pygame
模組中匯入以K_
開頭的變數(比如K_w
),並將這些變數作為索引,可從ScancodeWrapper
物件中取得某個按鍵的按下狀態(True
表示被按下)。
在下面的範例中,我們判斷玩家是否同時按下了上方向鍵和右Ctrl鍵,如果是則遊戲迴圈結束。
# 匯入 key 模組和其他相關內容,並建立遊戲視窗
from pygame import key, event, display, K_UP, K_RCTRL
display.set_mode([800, 600])
while True:
# 明確的呼叫 pump 函式
event.pump()
# 取得所有按鍵的按下狀態
ps = key.get_pressed()
# 如果同時按下了上方向鍵和右 Ctrl 鍵,則遊戲結束
if ps[K_UP] and ps[K_RCTRL]:
break
取得和設定鍵盤輔助按鍵的按下狀態
key
模組的get_mods
函式,可取得鍵盤輔助按鍵的按下狀態,而使用get_pressed
函式可以達到與get_mods
函式同樣的目的。
get_mods()
- 傳回值
get_mods
函式傳回一個表示輔助按鍵按下狀態的整數。你可以從pygame
模組中匯入以KMOD_
開頭的變數(比如KMOD_RCTRL
),並通過&
運算傳回值和這些變數,以判斷某個輔助按鍵是否被按下(運算結果不為0
表示輔助按鍵被按下)。
key
模組的set_mods
函式,可用於臨時設定鍵盤輔助按鍵的按下狀態。一旦某個輔助按鍵被設定為按下狀態,那麽該狀態可能會持續一段時間,直到某些情況發生,比如,輔助按鍵被真實的按下並釋放,或再次呼叫set_mods
函式並設定了其他輔助按鍵的按下狀態。
set_mods(mods)
- mods 參數
mods
參數是表示輔助按鍵按下狀態的整數。你可以從pygame
模組中匯入以KMOD_
開頭的變數(比如KMOD_RCTRL
),並通過|
運算這些變數(如果需要設定多個輔助按鍵為按下狀態),以表示對應的輔助按鍵處於被按下的狀態。
set_mods 函式僅影響 get_mods 函式的結果
通過set_pos
設定輔助按鍵的按下狀態,僅會影響get_mods
函式,不會改變的get_pressed
函式的傳回值,也不會引發按鍵的按下事件。
在下面的範例中,由於我們臨時設定了輔助按鍵的按下狀態,因此只需按下A鍵或Q鍵,即可觸發相應的操作。
# 匯入 key 模組和其他相關內容,並建立遊戲視窗
from pygame import key, event, display, K_a, K_q, KMOD_LALT, KMOD_LCTRL
display.set_mode([800, 600])
# 臨時將左 Alt 鍵和左 Ctrl 鍵設定為按下
key.set_mods(KMOD_LALT | KMOD_LCTRL)
while True:
# 明確的呼叫 pump 函式
event.pump()
# 取得所有按鍵和輔助按鍵的按下狀態
ps = key.get_pressed()
mods = key.get_mods()
# 如果按下左 Ctrl 鍵和 A 鍵,則遊戲結束
if ps[K_a] and (mods & KMOD_LCTRL):
print('角色攻擊')
# 如果按下左 Alt 鍵和 Q 鍵,則遊戲結束
if ps[K_q] and (mods & KMOD_LALT):
break
取得和設定鍵盤按鍵的重複狀態
Pygame 控製鍵盤按鍵的重複狀態,持續引發按下事件影片示範 YouTube
key
模組的函式get_repeat
和set_repeat
,可取得和設定鍵盤按鍵的重複狀態。在預設情況下,當某個鍵盤按鍵被按下時,只會引發一次按下事件,如果設定了重複,那麽按住按鍵可持續的引發按下事件(不包括釋放事件)。
get_repeat()
- 傳回值
get_repeat
函式傳回一個表示目前按鍵重複狀態的形式為(delay, interval)
的整數元組,其中delay
表示第一次重複引發按下事件之前的延遲時間,以毫秒為單位,interval
表示重複引發的按下事件之間的間隔時間,比如第一次和第二次重複事件之間的間隔時間,以毫秒為單位。
set_repeat(delay=0, interval=0)
- delay 參數
delay
參數表示第一次重複引發按下事件之前的延遲時間,以毫秒為單位。如果該參數為0
,則表示不會重複引發按鍵的按下事件。- interval 參數
interval
參數表示重複引發的按下事件之間的間隔時間,比如第一次和第二次重複事件之間的間隔時間,以毫秒為單位。如果該參數為0
,那麽他將采用delay
參數的值。
在下面的範例中,按住某個按鍵1
秒後,將重複引發按下事件,被重複引發的事件之間間隔0.5
秒。
# 匯入 key 模組和其他相關內容,並建立遊戲視窗
from pygame import key, event, display, KEYDOWN, KEYUP, QUIT
display.set_mode([800, 600])
# 1 秒後開始重複按下事件,重複事件之間間隔 0.5 秒
key.set_repeat(1000, 500)
print(key.get_repeat())
running = True
while running:
# 隱含的呼叫 pump 函式
for e in event.get():
if e.type == QUIT:
running = False
elif e.type == KEYDOWN:
print('按下', e)
elif e.type == KEYUP:
print('釋放', e)
(1000, 500)
判斷遊戲視窗是否擁有鍵盤輸入焦點
key
模組的get_focused
函式,可用於判斷遊戲視窗是否擁有鍵盤輸入焦點。
get_focused()
- 傳回值
如果
get_focused
函式傳回True
,則遊戲視窗擁有鍵盤輸入焦點。
# 匯入 key 模組和其他相關內容,並建立遊戲視窗
from pygame import key, event, display, QUIT
display.set_mode([800, 600])
running = True
while True:
# 隱含的呼叫 pump 函式,並處理事件
for e in event.get():
if e.type == QUIT:
running = False
print('擁有輸入焦點?', key.get_focused())
取得鍵盤按鍵的名稱和 ID
key
模組的name
函式,可根據給出的鍵盤按鍵 ID,傳回按鍵名稱。
name(key, use_compat=True)
- key 參數
key
參數是一個整數,表示需要取得名稱的按鍵的 ID。- use_compat 參數
如果
use_compat
參數為True
,那麽同一個按鍵所傳回的名稱是相同的,即便在不同版本的 Pygame 中。如果use_compat
參數為False
,那麽需要在不同版本的 Pygame 中,同一個按鍵可能傳回不同的名稱。- 傳回值
name
函式傳回表示按鍵名稱的字串。
key
模組的key_code
函式,可根據給出的鍵盤按鍵名稱,傳回按鍵 ID。
key_code(name)
- name 參數
name
參數是表示按鍵名稱的字串。如果你呼叫了
name
函式,並且其use_compat
參數為True
,那麽將函式的傳回值作為key_code
函式的name
參數,可能會導致例外狀況。- 傳回值
key_code
函式傳回表示按鍵 ID 的整數。
在下面的範例中,由於在呼叫name
函式時,其參數use_compat
被設定為了False
,因此,需要初始化display
模組。
from pygame import key, display, K_CAPSLOCK
# 需要初始化 display 模組
display.init()
# 取得按鍵名稱
n = key.name(K_CAPSLOCK, False)
print(n)
# 取得按鍵 ID
print(key.key_code(n))
內容分類
原始碼
講解影片
Pygame 取得鍵盤按鍵(組合)的按下狀態·YouTube
Pygame 控製鍵盤按鍵的重複狀態,持續引發按下事件·YouTube