URLhttps://learnscript.net/zh/pygame/mouse/
    复制链接转到说明  示例

    如何获取和设置鼠标的信息和状态(位置,移动距离,按键状态,指针可见性等)

    我被代码海扁署名-非商业-禁演绎
    阅读 9:33·字数 2870·发布 

    本节内容不涉及鼠标事件的讲解,要了解如何处理鼠标事件,请查看如何处理游戏中的鼠标,键盘事件一节。

    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/mouse·codebeatme/pygame·GitHub

    讲解视频

    如何在 Pygame 中获取和设置鼠标位置·YouTube如何在 Pygame 中获取和设置鼠标位置·Bilibili
    如何在 Pygame 中获取鼠标移动距离和方向·YouTube如何在 Pygame 中获取鼠标移动距离和方向·Bilibili
    如何在 Pygame 中判断鼠标按键是否被按下·YouTube如何在 Pygame 中判断鼠标按键是否被按下·Bilibili
    如何在 Pygame 中获取和设置鼠标指针的可见性·YouTube如何在 Pygame 中获取和设置鼠标指针的可见性·Bilibili