Pygame事件队列

时间:2012-01-14 23:02:16

标签: python events queue pygame

我想知道是否有一种方法可以在不从队列中删除事件的情况下使用poll()get()

在我的游戏中,我检查不同位置的输入(不仅在主循环中),有时我需要在不同的地方检查相同的事件,但是当我将其从队列中删除时检查它。我尝试使用peek(),但问题是我无法获得与事件完成相对应的密钥。

while 1:
    event = pygame.event.poll()
    if event.type == KEYDOWN:
        return event.key
    else:
        pass

#works but removes event from the queue

这可以获得与事件相对应的密钥,但是peek()不能:

pygame.event.peek(pygame.KEYDOWN).key 
#dosent work

但是我不能使用第一种方法,因为从队列中删除了事件,所以我无法检查程序中其他地方的关键事件。
我不太清楚queue是如何工作的,所以也许我只是错了,但我在不同的位置尝试了第一次,只是第一次检查它有效的事件。

我的目标是在游戏中检查不同班级的活动。

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

我认为更好的设计是在一个地方检查事件 - 即使是在mainloop代码之外的一个因子函数或方法中,并将所有相关事件数据保存在其他对象(作为属性)或变量中。 / p>

例如,您可以使用所有当前按下的键,当前鼠标位置和按钮状态来保持对Python集的引用,并将这些变量传递给函数和方法。

否则,如果你需要只检查按下的键和鼠标状态(和指针位置),你可以完全绕过事件(只保留对mainloop上的pygame.event.pump()的调用)。 pygame.key.get_pressed函数是我最喜欢的键盘读取方式 - 它返回一个序列,其位置与键码一样多,每个按下的键在此向量中的对应位置设置为True。 (密钥代码在pygame.locals中可用作常量,如K_ESC,K_a,K_LEFT等)。

例如:

if pygame.key.get_pressed()[pygame.K_ESCAPE]:
     pygame.quit()

鼠标模块(在http://www.pygame.org/docs/ref/mouse.html中记录)允许您获取鼠标状态而不会消耗事件。

最后,如果您真的想要获取事件,我看到的可能性是,如果没有消耗,则通过调用pygame.event.post将事件重新发布到队列中 - 可以放置此调用,例如if / elif序列中的else子句,用于检查事件队列中的某些状态。

答案 1 :(得分:0)

我不知道它是不是好风格,但我所做的只是将所有事件保存在变量中并将其传递给使用自己的事件队列来检测“他们的”事件的对象。

while running:
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.QUIT:
                running = False

        self.allS.update(events)

并在更新方法中:

for event in events:
    print("Player ", event)