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

    如何获取和设置键盘的信息和状态(按键状态,重复状态等)

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

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

    Pygame 中的 key 模块

    Pygame 的key模块,提供了一些与键盘相关的函数,可以帮助开发者获取或设置键盘的信息和状态,比如,键盘按键的按下状态。当然,在处理与键盘相关的事件时,键盘的信息也可能会由Event事件对象提供。

    请确保 Pygame 能够自行处理事件

    如果希望key模块中的函数能够正常工作,那么应在游戏循环中调用event模块的pump函数,该函数能够让 Pygame 自行处理事件。当然,event模块的某些函数会隐式的调用pump,比如get函数(当其参数pumpTrue时)。

    事件

    关于如何让 Pygame 自行处理事件,请查看让 Pygame 自行处理事件队列中的事件一段。

    获取键盘按键的按下状态

    key模块的get_pressed函数,可获取键盘上所有按键的按下状态,通常用于判断某个按键是否被按下,或某些按键是否被一同按下。

    get_pressed()

    返回值

    get_pressed函数返回一个类型为ScancodeWrapper的对象(类ScancodeWrapper属于模块key),你可将该对象简单的视为一个布尔类型的元组。通过从pygame模块中导入以K_开头的变量(比如K_w),并将这些变量作为索引,可从ScancodeWrapper对象中获取某个按键的按下状态(True表示被按下)。

    在下面的示例中,我们判断玩家是否同时按下了上方向键和右Ctrl键,如果是则游戏循环结束。

    pressed.py
    # 导入 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键,即可触发相应的操作。

    mods.py
    # 导入 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

    获取和设置键盘按键的重复状态

    key模块的函数get_repeatset_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秒。

    repeat.py
    # 导入 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,则游戏窗口拥有键盘输入焦点。

    focused.py
    # 导入 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模块。

    name_code.py
    from pygame import key, display, K_CAPSLOCK
    # 需要初始化 display 模块
    display.init()
    
    # 获取按键名称 n = key.name(K_CAPSLOCK, False) print(n)
    # 获取按键 ID print(key.key_code(n))

    内容分类

    源码

    src/zh/key·codebeatme/pygame·GitHub

    讲解视频

    如何在 Pygame 中判断键盘按键是否被按下·YouTube如何在 Pygame 中判断键盘按键是否被按下·Bilibili
    如何在 Pygame 中重复引发键盘按键的按下事件·YouTube如何在 Pygame 中重复引发键盘按键的按下事件·Bilibili