Pygame 键被​​按下

3 keyboard pygame python-2.7

只要按下一个键,pygame 就运行某些东西的惯用方式是什么?使用pygame.key.get_pressed()[pygame.K_p]==Truepygame.mouse.get_pressed()==(1,0,0)似乎只有当按键或按钮被敲击时才会做出反应。while例如,应该使用循环吗?

我运行下面的代码,只有在按下按键/按钮时才会在 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()
Run Code Online (Sandbox Code Playgroud)

fur*_*ras 5

事件KEYDOWN意味着“按键状态从向上更改为向下” - 它并不意味着“按键一直按下”

在此输入图像描述

当您开始按键时 - 它会生成事件KEYDOWNpygame.event.get()返回非空列表 - 并且for循环可以执行if pygame.event.get()

当您按住按键时 - 它不会生成事件KEYDOWN- 并pygame.event.get()返回空列表 - 并且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()
Run Code Online (Sandbox Code Playgroud)

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

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()
Run Code Online (Sandbox Code Playgroud)