Pygame 键被按下

Pygame key getting pressed

只要按下一个键,对 pygame 和 运行 的惯用表达方式是什么?使用 pygame.key.get_pressed()[pygame.K_p]==Truepygame.mouse.get_pressed()==(1,0,0) 它似乎只在按键或按钮被击中时做出反应。例如,是否应该使用 while 循环?

我 运行 下面的代码,只有在按下 key/button:

时,我才会在 shell 中打印
def main():
done = True
while done:
    for i in pygame.event.get():
        if pygame.key.get_pressed()[pygame.K_a] == 1:
            print "Key a is being pressed..."
        elif i.type == KEYDOWN and i.key == pygame.K_q:
            done = 0
    pygame.display.update()
pygame.quit()
main()

事件 KEYDOWN 意味着 "key changed state from UP to DOWN" - 它并不意味着 "key is held pressed all time"

当你开始按下键时 - 它生成事件 KEYDOWNpygame.event.get() returns 不是空列表 - for 循环可以执行 if pygame.event.get()

当您按住键时 - 它不会生成事件 KEYDOWN - pygame.event.get() returns 空列表 - for 循环不会执行 if pygame.event.get()

您的代码应该如下所示

running = True
while running:
    # check events 
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == pygame.K_q:
               running = False

    # do it outside of `for event` loop
    # it is executed many times 
    if pygame.key.get_pressed()[pygame.K_a]: 
        print "Key is hold pressed..."

    pygame.display.update()

或者 - 当你只需要执行一次时

key_A_pressed = False

running = True
while running:
    # check events 
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == pygame.K_q:
               running = False

            elif event.key == pygame.K_a:
               key_A_pressed = True

               # it is executed only once
               print "Key A - start pressing"

        if event.type == KEYUP:
            if event.key == pygame.K_a:
               key_A_pressed = False

               # it is executed only once
               print "Key A - stop pressing"

    # do it only once - outside of `for event` loop
    # it is executed many times 
    #if pygame.key.get_pressed()[pygame.K_a]: 
    # or
    if key_A_pressed:
        print "Key A is held pressed..."

    pygame.display.update()

你应该使用:

def main():
    done = False
    while not done:
        for i in pygame.event.get():
            if i.type == KEYDOWN and i.key == pygame.K_q:
                done = True

        pressed = pygame.key.get_pressed()     
        if pressed[pygame.K_a]:
            print "Key a is being pressed..."

        pygame.display.update()
    pygame.quit()

if __name__ == '__main__':
    main()

您的代码中的问题是您仅在遍历所有接收到的事件时才检查是否按下了按键;所以如果没有事件,print "Key a is being pressed..." 部分永远不会执行。

把它放在事件循环之外。

此外,您不需要明确地与 True 进行比较; idiomatic/pythonic 方法就是使用 if pressed[pygame.K_a]:.