在pygame / python中,有没有办法检测先前或后面按下哪个键?

时间:2016-08-05 23:46:32

标签: python pygame

例如,如果我按住w然后按住一个,有没有办法让pygame告诉我我先把哪个键固定下来?

我需要知道这一点,因为对于我试图使用pygame的游戏,角色没有平滑的动作。移动的示例代码如下。

我首先检测并设置方向,然后为每个方向设置xchange和y更改。

然后我将它添加到播放器的x和y,然后将其添加到屏幕上。

问题是,如果我按住(s)然后按住(d),我希望角色向下移动然后移动,但我必须释放向下按钮才能实现。这是因为在我的代码中,if键[k_s]位于四个方向的底部并最后进行评估,这将把方向值替换为down。如果我按下右(d)然后向下(s)以改变方向,则运动是平滑的。

感谢您的帮助!

    keys = pygame.key.get_pressed()
if keys[K_a] or keys[K_d] or keys[K_w] or keys[K_s]:


    if keys[K_d] and keys[K_a]:
        direction = "none"

    if keys[K_w] and keys[K_s]:
        direction = "none"

    else:
        #if direction == "none":
        if keys[K_a]:
            direction = "left"
        if keys[K_d]:
            direction = "right"
        if keys[K_w]:
            direction = "up"
        if keys[K_s]:
            direction = "down"
else:
    direction = "none"

currentarea.putbackground()            
currentarea.putdoor()


if direction == "none":
    ychange = 0
    xchange = 0 

elif direction == "up":
    xchange = 0
    ychange = -3

elif direction == "down":
    xchange = 0
    ychange = 3

elif direction == "left":
    xchange = -3
    ychange = 0

elif direction == "right":
    xchange = 3
    ychange = 0

1 个答案:

答案 0 :(得分:1)

如果循环遍历事件循环,您将按照创建顺序接收事件。然后你可以做的是创建一个列表,对你按下的键进行排队,并在你释放它们时删除它们。列表中的第一个元素将始终是您按下但尚未发布的第一个键。

pressed_keys = []
while True:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_a:
                pressed_keys.append("left")
            elif event.key == pygame.K_d:
                pressed_keys.append("right")
            elif event.key == pygame.K_w:
                pressed_keys.append("up")
            elif event.key == pygame.K_s:
                pressed_keys.append("down")
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_a:
                pressed_keys.remove("left")
            elif event.key == pygame.K_d:
                pressed_keys.remove("right")
            elif event.key == pygame.K_w:
                pressed_keys.remove("up")
            elif event.key == pygame.K_s:
                pressed_keys.remove("down")

    try:
        print(pressed_keys[0])  # Will give IndexError if list is empty
        #  print(pressed_keys)  # Uncomment to see it in action
    except IndexError:
        pass