如何处理游戏中的鼠标,键盘事件
关注 1421
虽然本节所提到的内容与事件有关,但捕获事件的方法,请参考如何捕获处理游戏事件?以及创建和引发自定义事件等问题一节。
鼠标事件
以下所提到的与鼠标相关的事件,其所对应的Event
对象均拥有touch
变量,如果该变量为True
,则表示事件是由触控行为引发。
如何在 Pygame 中处理鼠标的按键事件视频演示 YouTube如何在 Pygame 中处理鼠标的按键事件视频演示 Bilibili
pygame
模块拥有变量MOUSEBUTTONUP
和MOUSEBUTTONDOWN
,他们分别表示按下鼠标按键和释放鼠标按键的事件,而以上两个事件所对应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 中处理鼠标的移动事件视频演示 YouTube如何在 Pygame 中处理鼠标的移动事件视频演示 Bilibili
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 官方并未解释
x
和y
变量的作用,但他们可能与precise_x
,precise_y
类似,同样表示鼠标滚轮的滚动量,只不过其类型是整数而非浮点数。- flipped 变量
如果
flipped
变量为True
,则x
,y
,precise_x
,precise_y
变量的值相反(Pygame 官方未做进一步的解释)。
鼠标
除了通过事件,你也可以使用mouse
模块来实现与鼠标相关的功能,具体请查看如何获取和设置鼠标的信息和状态(位置,移动距离,按键状态,指针可见性等)一节。
在下面的示例中,我们简单的显示了不同鼠标事件的消息。
# 导入相关模块,并创建游戏窗口
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 中处理键盘的按键事件视频演示 YouTube如何在 Pygame 中处理键盘的按键事件视频演示 Bilibili
pygame
模块拥有变量KEYDOWN
和KEYUP
,他们分别表示按下键盘按键和释放键盘按键的事件,而以上两个事件所对应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键时,游戏循环将结束。
这里需要指出,在运行示例时,请确保输入法为英文,否则相关的键盘事件可能不会被引发。
# 导入相关模块,并创建游戏窗口
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)
源码
讲解视频
如何在 Pygame 中处理鼠标的按键事件·YouTube如何在 Pygame 中处理鼠标的按键事件·Bilibili
如何在 Pygame 中处理鼠标的移动事件·YouTube如何在 Pygame 中处理鼠标的移动事件·Bilibili
如何在 Pygame 中处理键盘的按键事件·YouTube如何在 Pygame 中处理键盘的按键事件·Bilibili