是我还是pygame.key.get_pressed()无效?

use*_*527 4 python pygame input

好吧,所以我正在制作一个基本的太空船游戏.

我不能让旋转工作,因为它扰乱了位图,但那是另一个问题.我应该使用gif吗?任何其他文件类型的建议?

回到这里的实际点,所以:

k = pygame.key.get_pressed()
Run Code Online (Sandbox Code Playgroud)

是的,自我解释.这不起作用,因为它按下时返回每个键.

所以,在其他地方:

d = k[pygame.K_d]
Run Code Online (Sandbox Code Playgroud)

和另一行:

print d
Run Code Online (Sandbox Code Playgroud)

另一个:

if d:
Run Code Online (Sandbox Code Playgroud)

因此,当按下键盘上的每个键时,k返回.

无论是否按下d,d都会无限期地返回0.

d始终为0.

因此关于d的陈述永远不会成立.

为什么会这样?

Mar*_*eth 7

您可能会对get_pressed()实际执行的操作感到困惑.来自文档:

返回一组布尔值,表示键盘上每个键的状态.使用键常量值来索引数组.True值表示按下该按钮.

使用此功能获取按下的按钮列表不是处理来自用户的文本输入的正确方法.您无法知道按下的键的顺序,并且在两次调用pygame.key.get_pressed()之间可以完全忽略快速按键.也无法将这些推送的密钥转换为完全翻译的字符值.请参阅事件队列上的pygame.KEYDOWN事件以获取此功能.

换句话说,当你调用get_pressed(),你所得到的键盘状态的表示在get_pressed()被调用的时间.

例如,让我们说你的游戏中有一秒你调用get_pressed().你会得到一个列出键盘上所有键的结构,如果按下它们(它们都将是假的).

在游戏的两秒钟,你按一个键.如果你看一下你之前看到的相同结构,它仍然会说一切都没有被按下,因为你仍然在看着键盘的状态,就像它是在一秒钟之前.但是,如果再次调用get_pressed(),则会返回一个新的更新结构,这个新结构应该显示按下了该键.

解决此问题的一种方法是执行以下操作:

while True:
    # Update Stuff
    # Draw Stuff
    state = pygame.key.get_pressed()
    # Now check the keys
Run Code Online (Sandbox Code Playgroud)

现在,您将获得有关键盘的最新信息.

有一点需要注意的是,使用上述功能,您可能仍然可能会错过键盘按键.如果更新功能需要很长时间,则可能会按下一个键,然后在足够小的时间内按下键,以便在键关闭时不会调用get_pressed().

如果这可能是一个问题,您可能希望使用事件循环.就像是...

is_moving = False

while True:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN and event.key == pygame.K_d:
            is_moving = True
        elif event.type == pygame.KEYUP and event.key == pygame.K_d:
            is_moving = False
Run Code Online (Sandbox Code Playgroud)