pygame.key.get_pressed()在事件循环内外的区别是什么?
Pygame里
pygame.key.get_pressed()放内外的区别 先明确核心:pygame.key.get_pressed()是获取当前所有按键的实时状态快照,而事件循环是处理Pygame事件队列里的逐个事件,两者逻辑完全不同,放置位置直接影响按键逻辑的效果。
放在事件循环外部(你的示例写法)
每次主循环迭代一次,就获取一次当前键盘的完整状态。不管事件队列里有没有按键相关事件,每帧都会更新一次按键状态。这种写法专门用来处理按住按键持续生效的场景——比如按住方向键让角色一直移动、按住加速键让车辆持续提速。它能保证每帧都拿到最新的按键状态,不会因为事件队列的延迟或处理顺序,漏掉你按住按键的状态。
修正语法后的示例代码:
while True: clock.tick(60) for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # 每帧更新一次按键状态 pressed_key = pygame.key.get_pressed() # 用状态处理持续移动逻辑 if pressed_key[pygame.K_LEFT]: player_x -= 5
放在事件循环内部
只有在处理事件队列里的事件时,才会去获取按键状态,而且每处理一个事件就获取一次。这会带来几个问题:
- 如果事件队列里没有按键事件(比如只有关闭窗口的QUIT事件),这段代码根本不会执行,
pressed_key要么保持上次的旧状态,要么直接未定义,逻辑直接混乱。 - 就算有按键事件,也只是在处理该事件的瞬间获取一次状态。比如按住方向键时,Pygame只会触发一次
KEYDOWN事件,之后不会持续发送事件,这时放在内部的get_pressed()只能在那次事件处理时获取一次状态,后续帧没有新按键事件的话,就不会更新状态,没法实现“按住一直动”的效果。
不推荐的错误写法示例:
while True: clock.tick(60) for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # 仅处理事件时更新状态,存在诸多问题 pressed_key = pygame.key.get_pressed()
一句话总结
- 要实现按住按键持续生效的逻辑,必须把
pygame.key.get_pressed()放在事件循环外部、主循环的每一次迭代中,保证每帧都能拿到最新状态。 - 如果是按一次键触发一次动作(比如按空格开枪),直接在事件循环里用
event.type == pygame.KEYDOWN判断特定按键即可,完全不需要用到get_pressed()。
内容的提问来源于stack exchange,提问作者user15498167
相关产品推荐
相关产品推荐

