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

    如何处理游戏中的鼠标,键盘事件

    我被代码海扁署名-非商业-禁演绎
    阅读 9:28·字数 2841·更新 

    虽然本节所提到的内容与事件有关,但捕获事件的方法,请参考如何捕获处理游戏事件?以及创建和引发自定义事件等问题一节。

    鼠标事件

    以下所提到的与鼠标相关的事件,其所对应的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/event/mouse_and_keyboard·codebeatme/pygame·GitHub

    讲解视频

    如何在 Pygame 中处理鼠标的按键事件·YouTube如何在 Pygame 中处理鼠标的按键事件·Bilibili
    如何在 Pygame 中处理鼠标的移动事件·YouTube如何在 Pygame 中处理鼠标的移动事件·Bilibili
    如何在 Pygame 中处理键盘的按键事件·YouTube如何在 Pygame 中处理键盘的按键事件·Bilibili