如何区分pygame中的键是按住还是按下?

问题描述

我正在尝试实现一个功能,通过按住 WASD 键,我的角色在屏幕上可以移动,而按空格键应该会导致我的角色攻击。用户不能按住空格键进行攻击,同时可以按住 WASD 键移动。这个实现会导致攻击的预期行为,但它会导致移动也被按下一个键激活,因此无法按住 WASD 移动:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        sys.exit()
    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_w]:
        pos_y += speed                   //change y-position by the value of speed
    if pressed[pygame.K_a]:
        pos_x -= speed
    if pressed[pygame.K_s]:
        pos_y -= speed
    if pressed[pygame.K_d]:
        pos_x += speed

    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_SPACE:
            attack()                    //execute attack logic - irrelevant for this example

有没有办法区分按键是按住还是刚刚按下?

解决方法

pygame.key.get_pressed() 返回一个包含每个键状态的序列。如果某个键被按下,则该键的状态为 True,否则为 False。使用 pygame.key.get_pressed() 评估按钮的当前状态。您必须在应用程序循环而不是事件循环中调用 pygame.key.get_pressed()

# application loop
while True:

    #event loop
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                attack() 

    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_w]:
        pos_y += speed      
    if pressed[pygame.K_a]:
        pos_x -= speed
    if pressed[pygame.K_s]:
        pos_y -= speed
    if pressed[pygame.K_d]:
        pos_x += speed

    # [...]