为什么这段用于检查 pygame 中是否按下了两个键的代码不起作用?

Why is this code for checking if two keys being pressed in pygame not working?

下面的代码是我使用 pygame 编写的代码的一部分,只是为了检查左键 AND/OR 右键是否被按下并相应地移动播放器 img。除了最后一行之外的所有行都在运行和更新游戏的 while 循环中。按左键应该使 left_pressed 为真并将 playerX_change 设置为 -0.1(用于更新玩家的位置)。按右键应该相反。

所有功能都与左键一起使用,img 移动并在控制台中打印消息。

但是,右键不起作用。使用 print 测试一些东西表明按下右键确实将 right_pressed 设置为 True (至少暂时)但是当稍后检查 right_pressed 它现在是 False 并且不会移动 img 或打印一条消息。

(最后的 elif 语句是这样的,如果同时按下左右键,播放器 img 将不会移动。)

关于为什么在这种情况下右键与左键不同或者为什么 right_pressed 可能会过快地切换到 False 的任何想法都将是惊人的。

感谢任何帮助!谢谢! :) '''

    keys_pressed = pygame.key.get_pressed()
    right_pressed = False
    left_pressed = False

    if keys_pressed[pygame.K_RIGHT]:
        right_pressed = True
    elif keys_pressed[pygame.K_LEFT]:
        left_pressed = True

    if pygame.K_RIGHT not in keys_pressed:
        right_pressed = False
    elif pygame.K_LEFT not in keys_pressed:
        left_pressed = False

    if right_pressed:
        playerX_change = 0.1
        print("Right pressed")
    elif left_pressed:
        playerX_change = -0.1
        print("Left pressed")
    elif right_pressed and left_pressed:
        playerX_change = 0
        print("Right and left pressed")
    else:
        playerX_change = 0

playerX += playerX_change

'''

因为您使用 ifelif,如果第一个 if 为真,代码将永远不会处理 elif。所以在这种情况下,如果 keys_pressed[pygame.K_RIGHT] 为真,它永远不会检查 keys_pressed[pygame.K_LEFT] 是否也为真。

因此进行此更改:

if keys_pressed[pygame.K_RIGHT]:
    right_pressed = True
# elif keys_pressed[pygame.K_LEFT]:
if keys_pressed[pygame.K_LEFT]:
    left_pressed = True

您在代码的开头将 right_pressedleft_pressed 设置为 False。它们仅在按下键时才会更改,因此无需将它们设置回 False.

最后,您应该先检查right_pressed and left_pressed。否则,由于我之前提到的 ifelif 行为,如果其中一个为真,它永远不会进入检查两者的代码。

我已经精简了代码,试试这个。它将检查是否按下了右而不是左,然后检查是否按下了左而不是右。否则,playerX_change 将设置为 0 (因为这是同时按下或 none 按下的值).

keys_pressed = pygame.key.get_pressed()

if keys_pressed[pygame.K_RIGHT] and not keys_pressed[pygame.K_LEFT]:
    playerX_change = 0.1
    print("Right pressed")
elif keys_pressed[pygame.K_LEFT] and not keys_pressed[pygame.K_RIGHT]:
    playerX_change = -0.1
    print("Left pressed")
else:
    playerX_change = 0

playerX += playerX_change