如何获取和设置键盘的信息和状态(按键状态,重复状态等)
关注 1800
本节内容不涉及键盘事件的讲解,要了解如何处理键盘事件,请查看如何处理游戏中的鼠标,键盘事件一节。
Pygame 中的 key 模块
Pygame 的key模块,提供了一些与键盘相关的函数,可以帮助开发者获取或设置键盘的信息和状态,比如,键盘按键的按下状态。当然,在处理与键盘相关的事件时,键盘的信息也可能会由Event事件对象提供。
请确保 Pygame 能够自行处理事件
如果希望key模块中的函数能够正常工作,那么应在游戏循环中调用event模块的pump函数,该函数能够让 Pygame 自行处理事件。当然,event模块的某些函数会隐式的调用pump,比如get函数(当其参数pump为True时)。
事件
关于如何让 Pygame 自行处理事件,请查看让 Pygame 自行处理事件队列中的事件一段。
获取键盘按键的按下状态
如何在 Pygame 中判断键盘按键是否被按下视频演示 YouTube如何在 Pygame 中判断键盘按键是否被按下视频演示 Bilibili
key模块的get_pressed函数,可获取键盘上所有按键的按下状态,通常用于判断某个按键是否被按下,或某些按键是否被一同按下。
get_pressed()
- 返回值
get_pressed函数返回一个类型为ScancodeWrapper的对象(类ScancodeWrapper属于模块key),你可将该对象简单的视为一个布尔类型的元组。通过从pygame模块中导入以K_开头的变量(比如K_w),并将这些变量作为索引,可从ScancodeWrapper对象中获取某个按键的按下状态(True表示被按下)。
在下面的示例中,我们判断玩家是否同时按下了上方向键和右Ctrl键,如果是则游戏循环结束。
# 导入 key 模块和其他相关内容,并创建游戏窗口
from pygame import key, event, display, K_UP, K_RCTRL
display.set_mode([800, 600])
while True:
# 显式的调用 pump 函数
event.pump()
# 获取所有按键的按下状态
ps = key.get_pressed()
# 如果同时按下了上方向键和右 Ctrl 键,则游戏结束
if ps[K_UP] and ps[K_RCTRL]:
break获取和设置键盘修饰按键的按下状态
key模块的get_mods函数,可获取键盘修饰按键的按下状态,而使用get_pressed函数可以达到与get_mods函数同样的目的。
get_mods()
- 返回值
get_mods函数返回一个表示修饰按键按下状态的整数。你可以从pygame模块中导入以KMOD_开头的变量(比如KMOD_RCTRL),并通过&运算返回值和这些变量,以判断某个修饰按键是否被按下(运算结果不为0表示修饰按键被按下)。
key模块的set_mods函数,可用于临时设置键盘修饰按键的按下状态。一旦某个修饰按键被设置为按下状态,那么该状态可能会持续一段时间,直到某些情况发生,比如,修饰按键被真实的按下并释放,或再次调用set_mods函数并设置了其他修饰按键的按下状态。
set_mods(mods)
- mods 参数
mods参数是表示修饰按键按下状态的整数。你可以从pygame模块中导入以KMOD_开头的变量(比如KMOD_RCTRL),并通过|运算这些变量(如果需要设置多个修饰按键为按下状态),以表示对应的修饰按键处于被按下的状态。
set_mods 函数仅影响 get_mods 函数的结果
通过set_pos设置修饰按键的按下状态,仅会影响get_mods函数,不会改变的get_pressed函数的返回值,也不会引发按键的按下事件。
在下面的示例中,由于我们临时设置了修饰按键的按下状态,因此只需按下A键或Q键,即可触发相应的操作。
# 导入 key 模块和其他相关内容,并创建游戏窗口
from pygame import key, event, display, K_a, K_q, KMOD_LALT, KMOD_LCTRL
display.set_mode([800, 600])
# 临时将左 Alt 键和左 Ctrl 键设置为按下
key.set_mods(KMOD_LALT | KMOD_LCTRL)
while True:
# 显式的调用 pump 函数
event.pump()
# 获取所有按键和修饰按键的按下状态
ps = key.get_pressed()
mods = key.get_mods()
# 如果按下左 Ctrl 键和 A 键,则游戏结束
if ps[K_a] and (mods & KMOD_LCTRL):
print('角色攻击')
# 如果按下左 Alt 键和 Q 键,则游戏结束
if ps[K_q] and (mods & KMOD_LALT):
break获取和设置键盘按键的重复状态
如何在 Pygame 中重复引发键盘按键的按下事件视频演示 YouTube如何在 Pygame 中重复引发键盘按键的按下事件视频演示 Bilibili
key模块的函数get_repeat和set_repeat,可获取和设置键盘按键的重复状态。在默认情况下,当某个键盘按键被按下时,只会引发一次按下事件,如果设置了重复,那么按住按键可连续的引发按下事件(不包括释放事件)。
get_repeat()
- 返回值
get_repeat函数返回一个表示当前按键重复状态的形式为(delay, interval)的整数元组,其中delay表示第一次重复引发按下事件之前的延迟时间,以毫秒为单位,interval表示重复引发的按下事件之间的间隔时间,比如第一次和第二次重复事件之间的间隔时间,以毫秒为单位。
set_repeat(delay=0, interval=0)
- delay 参数
delay参数表示第一次重复引发按下事件之前的延迟时间,以毫秒为单位。如果该参数为0,则表示不会重复引发按键的按下事件。- interval 参数
interval参数表示重复引发的按下事件之间的间隔时间,比如第一次和第二次重复事件之间的间隔时间,以毫秒为单位。如果该参数为0,那么他将采用delay参数的值。
在下面的示例中,按住某个按键1秒后,将重复引发按下事件,被重复引发的事件之间间隔0.5秒。
# 导入 key 模块和其他相关内容,并创建游戏窗口
from pygame import key, event, display, KEYDOWN, KEYUP, QUIT
display.set_mode([800, 600])
# 1 秒后开始重复按下事件,重复事件之间间隔 0.5 秒
key.set_repeat(1000, 500)
print(key.get_repeat())
running = True
while running:
# 隐式的调用 pump 函数
for e in event.get():
if e.type == QUIT:
running = False
elif e.type == KEYDOWN:
print('按下', e)
elif e.type == KEYUP:
print('释放', e)(1000, 500)判断游戏窗口是否拥有键盘输入焦点
key模块的get_focused函数,可用于判断游戏窗口是否拥有键盘输入焦点。
get_focused()
- 返回值
如果
get_focused函数返回True,则游戏窗口拥有键盘输入焦点。
# 导入 key 模块和其他相关内容,并创建游戏窗口
from pygame import key, event, display, QUIT
display.set_mode([800, 600])
running = True
while True:
# 隐式的调用 pump 函数,并处理事件
for e in event.get():
if e.type == QUIT:
running = False
print('拥有输入焦点?', key.get_focused())获取键盘按键的名称和 ID
key模块的name函数,可根据给出的键盘按键 ID,返回按键名称。
name(key, use_compat=True)
- key 参数
key参数是一个整数,表示需要获取名称的按键的 ID。- use_compat 参数
如果
use_compat参数为True,那么同一个按键所返回的名称是相同的,即便在不同版本的 Pygame 中。如果use_compat参数为False,那么需要在不同版本的 Pygame 中,同一个按键可能返回不同的名称。- 返回值
name函数返回表示按键名称的字符串。
key模块的key_code函数,可根据给出的键盘按键名称,返回按键 ID。
key_code(name)
- name 参数
name参数是表示按键名称的字符串。如果你调用了
name函数,并且其use_compat参数为True,那么将函数的返回值作为key_code函数的name参数,可能会导致异常。- 返回值
key_code函数返回表示按键 ID 的整数。
在下面的示例中,由于在调用name函数时,其参数use_compat被设置为了False,因此,需要初始化display模块。
from pygame import key, display, K_CAPSLOCK
# 需要初始化 display 模块
display.init()
# 获取按键名称
n = key.name(K_CAPSLOCK, False)
print(n)
# 获取按键 ID
print(key.key_code(n))内容分类
源码
讲解视频
如何在 Pygame 中判断键盘按键是否被按下·YouTube如何在 Pygame 中判断键盘按键是否被按下·Bilibili
如何在 Pygame 中重复引发键盘按键的按下事件·YouTube如何在 Pygame 中重复引发键盘按键的按下事件·Bilibili