【问题标题】:In pygame/python, is there a way to detect which key are pressed earlier or latter?在 pygame/python 中,有没有办法检测哪个键是先按还是后按?
【发布时间】:2016-08-06 08:51:39
【问题描述】:

例如,如果我按住 w 然后按住 a,pygame 有没有办法告诉我我先按住了哪个键?

我需要知道这一点,因为对于我尝试使用 pygame 制作的游戏,角色没有流畅的动作。运动示例代码如下。

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

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

问题是,如果我按住(s)然后按住右(d),我希望角色向下移动然后向右移动,但我必须释放向下按钮才能发生这种情况。这是因为在我的代码中,if keys[k_s] 位于四个方向的底部并最后评估,这会将方向值替换为向下。运动是平稳的,但是如果我按住右(d)然后再按住以改变方向,因为同样的原因。

感谢您的帮助!

    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

【问题讨论】:

    标签: python pygame


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2014-04-05
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      相关资源
      最近更新 更多