【问题标题】:Pygame event queuePygame 事件队列
【发布时间】:2012-02-10 13:44:57
【问题描述】:

我想知道是否有一种方法可以使用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

这样可以获得事件对应的key,但是peek()不能:

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

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

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

感谢您的帮助

【问题讨论】:

    标签: python events queue pygame


    【解决方案1】:

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

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

    否则,如果您只需要检查按键和鼠标状态(和指针位置),您可以完全绕过事件(仅在主循环中保留对 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 序列中的 987654326@ 子句,您可以在其中检查事件队列中的某些状态。

    【讨论】:

    • 好的,谢谢你的回答,所以我将有一个主循环并将事件作为我的其他函数的参数发送。另外,post是如何工作的?我阅读了文档,但我无法弄清楚。
    【解决方案2】:

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

    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)
    

    【讨论】:

      【解决方案3】:

      据我所知,没有一种“正确”的方法可以做到这一点,但一种选择是将所有事件保存到一个变量中。然后,您可以根据需要多次访问它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-18
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多