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

    如何處理遊戲中的滑鼠,鍵盤事件

    閱讀 8:58·字數 2695·更新 
    Youtube 頻道
    訂閱 375

    雖然本節所提到的內容與事件有關,但擷取事件的方法,請參考如何擷取處理遊戲事件?以及建立和引發自訂事件等問題一節。

    滑鼠事件

    以下所提到的與滑鼠相關的事件,其所對應的Event物件均擁有touch變數,如果該變數為True,則表示事件是由觸控行為引發。

    pygame模組擁有變數MOUSEBUTTONUPMOUSEBUTTONDOWN,他們分別表示按下滑鼠按鍵和放開滑鼠按鍵的事件,而以上兩個事件所對應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模組擁有變數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 官方並未解釋xy變數的作用,但他們可能與precise_xprecise_y類似,同樣表示滑鼠滾輪的捲動量,只不過其型別是整數而非浮點數。

    flipped 變數

    如果flipped變數為True,則xyprecise_xprecise_y變數的值相反(Pygame 官方未做進一步的解釋)。

    滑鼠

    除了通過事件,你也可以使用mouse模組來實作與滑鼠相關的功能,具體請檢視如何取得和設定滑鼠的資訊和狀態(位置,移動距離,按鍵狀態,指標可見性等)一節。

    在下面的範例中,我們簡單的顯示了不同滑鼠事件的訊息。

    mouse.py
    # 匯入相關模組,並建立遊戲視窗
    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模組擁有變數KEYDOWNKEYUP,他們分別表示按下鍵盤按鍵和放開鍵盤按鍵的事件,而以上兩個事件所對應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鍵時,遊戲迴圈將結束。

    這裏需要指出,在執行範例時,請確保輸入法為英文,否則相關的鍵盤事件可能不會被引發。

    keyboard.py
    # 匯入相關模組,並建立遊戲視窗
    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