如何获取和设置键盘的信息和状态(按键状态,重复状态等)
关注 1260
本节内容不涉及键盘事件的讲解,要了解如何处理键盘事件,请查看如何处理游戏中的鼠标,键盘事件一节。
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