PythonPyGame事件列表双enties且非常长

PythonPyGame事件列表双enties且非常长,python,python-3.x,pygame,pygame-surface,Python,Python 3.x,Pygame,Pygame Surface,好的,我正在使用Python3和Ubuntu Linux操作系统。 我有一个非常简单的机器人,当我按下箭头键时它就会移动。我的问题是,当我读取pygame事件列表时,它包含328个相同按键的元素。因此,我不能改变方向与我的机器人,因为我得到的信号不是一次,我得到它328次。这个问题有什么解决办法吗。 我的代码如下所示: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit()

好的,我正在使用Python3和Ubuntu Linux操作系统。
我有一个非常简单的机器人,当我按下箭头键时它就会移动。我的问题是,当我读取pygame事件列表时,它包含328个相同按键的元素。因此,我不能改变方向与我的机器人,因为我得到的信号不是一次,我得到它328次。这个问题有什么解决办法吗。 我的代码如下所示:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        pygame.quit()

    keys = pygame.key.get_pressed()
    for key in keys:
        if keys[pygame.K_LEFT]:
            self.map.move(self.map.x1 - 1, self.map.y1 + 0)

        elif keys[pygame.K_RIGHT]:
            self.map.move(self.map.x1 + 1, self.map.y1 + 0)

        elif keys[pygame.K_UP]:
            self.map.move(self.map.x1 + 0, self.map.y1 + 1)

        elif keys[pygame.K_DOWN]:
            self.map.move(self.map.x1 + 0, self.map.y1 - 1)

x1和y1是我的机器人的坐标

您不需要在按下的键上循环。只需删除键入键的
并移动
序列,如果。。。事件循环外部的elif

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        pygame.quit()

keys = pygame.key.get_pressed()

if keys[pygame.K_LEFT]:
    self.map.move(self.map.x1 - 1, self.map.y1 + 

elif keys[pygame.K_RIGHT]:
    self.map.move(self.map.x1 + 1, self.map.y1 + 0)

elif keys[pygame.K_UP]:
    self.map.move(self.map.x1 + 0, self.map.y1 + 1)

elif keys[pygame.K_DOWN]:
    self.map.move(self.map.x1 + 0, self.map.y1 - 1)

pygame.key.get_pressed()
检查调用函数时按下的键,通常您希望在每个主循环中调用它一次,但绝对不需要在循环中检查事件。

您不需要在按下的键上循环。只需删除键入键的
并移动
序列,如果。。。事件循环外部的elif

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        pygame.quit()

keys = pygame.key.get_pressed()

if keys[pygame.K_LEFT]:
    self.map.move(self.map.x1 - 1, self.map.y1 + 

elif keys[pygame.K_RIGHT]:
    self.map.move(self.map.x1 + 1, self.map.y1 + 0)

elif keys[pygame.K_UP]:
    self.map.move(self.map.x1 + 0, self.map.y1 + 1)

elif keys[pygame.K_DOWN]:
    self.map.move(self.map.x1 + 0, self.map.y1 - 1)

pygame.key.get_pressed()
检查调用函数时按下的键,通常希望每个主循环调用一次,但绝对不要在循环中检查事件。

如果在事件处理程序中处理按键关闭事件更方便:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        pygame.quit()
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            self.map.move(self.map.x1 - 1, self.map.y1 + 0)
        elif event.key == pygame.K_RIGHT:
            self.map.move(self.map.x1 + 1, self.map.y1 + 0)
        elif event.key == pygame.K_UP:
            self.map.move(self.map.x1 + 0, self.map.y1 + 1)
        elif event.key == pygame.K_DOWN:
            self.map.move(self.map.x1 + 0, self.map.y1 - 1)

这将防止处理一次以上的按键。

如果在事件处理程序中处理按键关闭事件更方便:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        pygame.quit()
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            self.map.move(self.map.x1 - 1, self.map.y1 + 0)
        elif event.key == pygame.K_RIGHT:
            self.map.move(self.map.x1 + 1, self.map.y1 + 0)
        elif event.key == pygame.K_UP:
            self.map.move(self.map.x1 + 0, self.map.y1 + 1)
        elif event.key == pygame.K_DOWN:
            self.map.move(self.map.x1 + 0, self.map.y1 - 1)

这应该可以防止多次处理单个按键。

是的,基本上你是对的,但我的按键列表包含328个元素,因此我仍然会将其加倍。(我已经用print(len(keys))检查过了)
pygame.key.get_pressed()
不会返回一个列表,而是一个将键盘的每个键映射到布尔值的字典
True
如果按下该键,则为False如果未按下该键。您只需检查感兴趣的键,这就是使用
if key[…]
所做的。如果你想达到移动机器人保持按键的效果,这很有用是的,基本上你是对的,但是我的按键列表包含328个元素,所以我还是会加倍。(我已经用print(len(keys))检查过了)
pygame.key.get_pressed()
不会返回一个列表,而是一个将键盘的每个键映射到布尔值的字典
True
如果按下该键,则为False如果未按下该键。您只需检查感兴趣的键,这就是使用
if key[…]
所做的。如果你想达到移动机器人保持按键的效果,这是很有用的