URLhttps://learnscript.net/zh-hant/pygame/key/
    複製連結移至說明  範例

    如何取得和設定鍵盤的資訊和狀態(按鍵狀態,重複狀態等)

    閱讀 9:27·字數 2839·更新 
    Youtube 頻道
    訂閱 375

    本節內容不涉及鍵盤事件的講解,要了解如何處理鍵盤事件,請檢視如何處理遊戲中的滑鼠,鍵盤事件一節。

    Pygame 中的 key 模組

    Pygame 的key模組,提供了一些與鍵盤相關的函式,可以幫助開發者取得或設定鍵盤的資訊和狀態,比如,鍵盤按鍵的按下狀態。當然,在處理與鍵盤相關的事件時,鍵盤的資訊也可能會由Event事件物件提供。

    請確保 Pygame 能夠自行處理事件

    如果希望key模組中的函式能夠正常工作,那麽應在遊戲迴圈中呼叫event模組的pump函式,該函式能夠讓 Pygame 自行處理事件。當然,event模組的某些函式會隱含的呼叫pump,比如get函式(當其參數pumpTrue時)。

    事件

    關於如何讓 Pygame 自行處理事件,請檢視讓 Pygame 自行處理事件佇列中的事件一段。

    取得鍵盤按鍵的按下狀態

    key模組的get_pressed函式,可取得鍵盤上所有按鍵的按下狀態,通常用於判斷某個按鍵是否被按下,或某些按鍵是否被一同按下。

    get_pressed()

    傳回值

    get_pressed函式傳回一個型別為ScancodeWrapper的物件(類別ScancodeWrapper屬於模組key),你可將該物件簡單的視為一個布林型別的元組。通過從pygame模組中匯入以K_開頭的變數(比如K_w),並將這些變數作為索引,可從ScancodeWrapper物件中取得某個按鍵的按下狀態(True表示被按下)。

    在下面的範例中,我們判斷玩家是否同時按下了上方向鍵和右Ctrl鍵,如果是則遊戲迴圈結束。

    pressed.py
    # 匯入 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鍵,即可觸發相應的操作。

    mods.py
    # 匯入 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

    取得和設定鍵盤按鍵的重複狀態

    key模組的函式get_repeatset_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秒。

    repeat.py
    # 匯入 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,則遊戲視窗擁有鍵盤輸入焦點。

    focused.py
    # 匯入 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模組。

    name_code.py
    from pygame import key, display, K_CAPSLOCK
    # 需要初始化 display 模組
    display.init()
    
    # 取得按鍵名稱 n = key.name(K_CAPSLOCK, False) print(n)
    # 取得按鍵 ID print(key.key_code(n))

    內容分類

    原始碼

    src/zh-hant/key·codebeatme/pygame·GitHub

    講解影片

    Pygame 取得鍵盤按鍵(組合)的按下狀態·YouTube
    Pygame 控製鍵盤按鍵的重複狀態,持續引發按下事件·YouTube