Pygame - 为什么 LSHIFT 在按键重复模式下不响应
Pygame - why LSHIFT does not respond in key repeat mode
我正在 Pygame 制作 3D 引擎。控件的一个元素涉及使用 WASD、LSHIFT 和 SPACE 来控制相机的 XYZ 坐标。我已经使用 pygame.key.set_repeat(1,10)
使键生成多个 pygame.KEYDOWN
事件。这适用于上述每个键 except 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 OS。任何人都可以解释为什么会这样,and/or 提出一个与我现在拥有的解决方案兼容(意味着相似的结构)?
似乎在使用 pygame.key.set_repeat
时 SDL 没有考虑 MOD 键(这只是 SDL_EnableKeyRepeat
的 Python 包装器)。
您可以使用它来获得所需的行为:
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 键按下事件时没有问题(我刚刚对此进行了测试)。看看这个Pygame implementation around SDL 2.
希望对您有所帮助。
我正在 Pygame 制作 3D 引擎。控件的一个元素涉及使用 WASD、LSHIFT 和 SPACE 来控制相机的 XYZ 坐标。我已经使用 pygame.key.set_repeat(1,10)
使键生成多个 pygame.KEYDOWN
事件。这适用于上述每个键 except 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 OS。任何人都可以解释为什么会这样,and/or 提出一个与我现在拥有的解决方案兼容(意味着相似的结构)?
似乎在使用 pygame.key.set_repeat
时 SDL 没有考虑 MOD 键(这只是 SDL_EnableKeyRepeat
的 Python 包装器)。
您可以使用它来获得所需的行为:
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 键按下事件时没有问题(我刚刚对此进行了测试)。看看这个Pygame implementation around SDL 2.
希望对您有所帮助。