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

    如何取得和設定滑鼠的資訊和狀態(位置,移動距離,按鍵狀態,指標可見性等)

    閱讀 8:49·字數 2648·發佈 
    Youtube 頻道
    訂閱 375

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

    Pygame 中的 mouse 模組

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

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

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

    事件

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

    取得和設定滑鼠在遊戲視窗中的位置

    mouse模組的函式get_posset_pos,可用於取得和設定滑鼠相對於遊戲視窗顯示區域左上角的相對位置(座標)。如果滑鼠位於左上角的右方,那麽位置的水平座標為正數,如果滑鼠位於左上角的下方,那麽位置的垂直座標為正數。當設定滑鼠位置時,將引發滑鼠移動事件(對應pygame模組的MOUSEMOTION變數)。

    get_pos()

    傳回值

    get_pos函式傳回一個形式類似於(x,y)的整數元組,表示滑鼠距離視窗顯示區域左上角的相對位置,其中x為水平方向的座標,y表示垂直方向的座標。

    當滑鼠位於視窗顯示區域之外時,get_pos函式可能傳回(0,0)

    set_pos(x, y)
    set_pos(pos)

    x 參數

    x參數是一個浮點數,表示滑鼠相對於視窗顯示區域左上角的水平方向座標。

    y 參數

    y參數是一個浮點數,表示滑鼠相對於視窗顯示區域左上角的垂直方向座標。

    pos 參數

    pos參數是一個序列物件,需要依次包含表示滑鼠相對於視窗顯示區域左上角的水平座標和垂直座標的浮點數。

    set_pos 函式不會將滑鼠的位置固定

    函式set_pos可以將滑鼠移動至某個位置,但其效果是一次性的,如果你希望滑鼠被固定在某個位置,那麽可在遊戲迴圈中不斷的呼叫該函式。

    position.py
    # 匯入相關模組,建立遊戲視窗
    from pygame import display, event, mouse
    display.set_mode((800, 600))
    
    while True: # 明確的呼叫 pump 函式 event.pump() # 取得滑鼠位置 (x, y) = mouse.get_pos()
    # 當滑鼠位於視窗左上角時,他將被移至中心 if x < 100 and y < 100: mouse.set_pos([400, 300])
    # 當滑鼠位於視窗右下角時,結束遊戲迴圈 if x > 700 and x < 800 and y > 500 and y < 600: break

    取得滑鼠在遊戲視窗中的移動距離

    mouse模組的get_rel函式,可用於取得滑鼠在遊戲視窗顯示區域中的移動距離,該距離相對於上一次呼叫此函式時的滑鼠位置。通過函式get_rel,可間接的判斷滑鼠的移動方向。

    get_rel()

    傳回值

    get_rel函式傳回一個形式類似於(x,y)的整數元組,表示滑鼠在視窗顯示區域中的移動距離,其中x為水平距離(為正數表示滑鼠相對於上一次向右進行了移動,為負數表示向左進行了移動),y表示垂直距離(為正數表示滑鼠相對於上一次向下進行了移動,為負數表示向上進行了移動)。

    在下面的範例中,按下滑鼠按鍵,將呼叫get_rel並顯示滑鼠的水平移動距離和垂直移動距離。

    relative.py
    # 匯入相關模組,建立遊戲視窗
    from pygame import display, event, mouse, MOUSEBUTTONDOWN
    display.set_mode((800, 600))
    
    running = True while running: # 隱含的呼叫 pump 函式 for e in event.get(): if e.type == MOUSEBUTTONDOWN: # 取得滑鼠的移動距離 (x, y) = mouse.get_rel() print('水平移動距離', x, '垂直移動距離', y)
    # 如果實際的移動距離大於 400,則遊戲迴圈結束 d = (x**2 + y**2) ** 0.5 print('實際移動距離', d)
    if d > 400: running = False

    取得滑鼠按鍵的按下狀態

    mouse模組的get_pressed函式,可用於一次性取得滑鼠上多個按鍵的按下狀態。

    get_pressed(num_buttons=3)

    num_buttons 參數

    num_buttons參數只能是35。如果設定為3,則取得滑鼠左按鍵,滾輪按鍵和右按鍵的按下狀態,如果設定為5,則還將取得第四個按鍵和第五個按鍵的按下狀態。

    傳回值

    根據所傳遞的num_buttons參數,get_pressed函式將傳回形式類似於(l,m,r)(l,m,r,b4,b5)的元組。其中,l對應滑鼠左按鍵,m對應滑鼠滾輪按鍵,r對應滑鼠右按鍵,b4對應滑鼠上的第四個按鍵,b5對應滑鼠上的第五個按鍵。

    在下面的範例中,如果同時按下滑鼠的左鍵,右鍵和滾輪鍵,那麽遊戲將結束。

    pressed.py
    # 匯入相關模組,建立遊戲視窗
    from pygame import display, event, mouse
    display.set_mode((800, 600))
    
    while True: # 明確的呼叫 pump 函式 event.pump() # 取得滑鼠按鍵的按下狀態 (l, m, r) = mouse.get_pressed()
    # 如果滑鼠左健,右鍵和滾輪鍵一同按下,那麽遊戲迴圈結束 if l and r and m: break

    取得和設定滑鼠指標是否可見

    mouse模組的函式get_visibleset_visible,可用於取得和設定滑鼠指標在遊戲視窗中是否可見。

    get_visible()

    傳回值

    如果get_visible函式傳回True,則表示滑鼠指標可見,否則表示不可見。

    set_visible(value)

    value 參數

    如果value參數等價於True,那麽滑鼠指標可見,否則不可見。

    在下面的範例中,如果點選滑鼠左鍵,則將切換滑鼠的可見狀態,如果點選滑鼠右鍵,則將結束遊戲。

    visible.py
    # 匯入相關模組和變數,建立遊戲視窗
    from pygame import display, event, mouse, QUIT, MOUSEBUTTONUP, BUTTON_LEFT, BUTTON_RIGHT
    display.set_mode((800, 600))
    
    running = True while running: # 隱含的呼叫 pump 函式 for e in event.get(): if e.type == QUIT: running = False elif e.type == MOUSEBUTTONUP: if e.button == BUTTON_LEFT: # 取得滑鼠的可見狀態,並反轉 v = mouse.get_visible() mouse.set_visible(not v) elif e.button == BUTTON_RIGHT: # 結束遊戲迴圈 running = False

    判斷滑鼠是否位於遊戲視窗中

    mouse模組的get_focused函式,可用於判斷滑鼠是否位於遊戲視窗的顯示區域之中,基本等同於判斷遊戲視窗是否能夠接收到滑鼠的輸入。

    get_focused()

    傳回值

    如果get_focused函式傳回True,則表示滑鼠位於視窗顯示區域之中,否則位於顯示區域之外。

    在下面的範例中,我們通過函式get_focused判斷滑鼠是否位於顯示區域,如果滑鼠離開或進入顯示區域的次數達到5,則遊戲迴圈將結束。

    focused.py
    # 匯入相關模組,建立遊戲視窗
    from pygame import display, event, mouse
    display.set_mode((800, 600))
    
    count = 0 focused = True while True: # 明確的呼叫 pump 函式 event.pump()
    # 判斷滑鼠是否離開了顯示區域 if focused and not mouse.get_focused(): focused = False count += 1 print('滑鼠離開了顯示區域')
    # 判斷滑鼠是否進入了顯示區域 if not focused and mouse.get_focused(): focused = True count += 1 print('滑鼠進入了顯示區域')
    # 切換次數達到 5 次時,結束遊戲 if count == 5: break

    內容分類

    原始碼

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

    講解影片

    Pygame 取得和設定滑鼠的位置座標·YouTube
    Pygame 取得滑鼠移動距離,以及判斷移動方向·YouTube
    Pygame 取得滑鼠按鍵的按下狀態·YouTube
    Pygame 控製滑鼠指標是否可見·YouTube