python – 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

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

我的目标是检查游戏中不同类别的事件.

谢谢你的帮助

最佳答案 我认为更好的设计是在一个地方检查事件 – 即使是在mainloop代码之外的一个分解函数或方法中,并将所有相关事件数据保存在其他对象(作为属性)或变量中.

例如,您可以使用所有当前按下的键,当前鼠标位置和按钮状态来保持对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 – 可以放置此调用,例如在else子句中在if / elif序列中,您检查事件队列中的某个状态.

点赞