[英]When processing pygame keyboard events, what does the key mod “pygame.KMOD_MODE” indicate is being pressed?
[英]Pygame - why LSHIFT does not respond in key repeat mode
我正在Pygame中制作3D引擎。 控件的元素包括使用WASD,LSHIFT和SPACE控制摄像机的XYZ坐标。 我已经使用pygame.key.set_repeat(1,10)
使这些键生成多个pygame.KEYDOWN
事件。 除了 LSHIFT 以外 ,以上每个键都可以正常工作。
可以通过将以下代码插入IDLE来重现该行为:
def testKeys():
import pygame
screen = pygame.display.set_mode((100,100))
pygame.key.set_repeat(1,100)
done = False
while not done:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE: print 'space'
elif event.key == pygame.K_LSHIFT: print 'shift'
elif event.key == pygame.ESCAPE: done = True
我得到的行为是SPACE键工作正常(生成多个事件):
space
space
space
space
space
但是LSHIFT键只生成一个事件:
shift
我正在使用Windows操作系统。 谁能解释为什么会这样,和/或提出一种与我现在所拥有的解决方案兼容(意味着相似的结构)的解决方案?
使用pygame.key.set_repeat
(这只是SDL_EnableKeyRepeat
的Python包装器)时,SDL似乎没有考虑MOD密钥。
您可以使用它来获得所需的行为:
def testKeys():
import pygame
from time import time
screen = pygame.display.set_mode((100,100))
pygame.key.set_repeat(1,100)
ticks = 0
done = False
while not done:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE: print 'space'
elif event.key == pygame.K_ESCAPE: done = True
new_ticks = time()
if new_ticks - ticks >= 0.1:
ticks = new_ticks
if pygame.key.get_pressed()[pygame.K_LSHIFT]:
print 'shift'
由于SDL 2键事件的工作原理略有不同,因此捕获多个shift键按下事件没有问题(我已经对此进行了测试)。 看看围绕SDL 2的Pygame实现 。
希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.