gpt4 book ai didi

python - Pygame 事件队列

转载 作者:太空宇宙 更新时间:2023-11-03 11:34:20 25 4
gpt4 key购买 nike

我想知道是否有一种方法可以使用 poll()get() 而无需从队列中删除事件。

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

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 是如何工作的,所以也许我只是误会了,但我在不同的位置尝试了第一个,并且只有在我第一次检查它工作的事件时才这样做。

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

谢谢你的帮助

最佳答案

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

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

否则,如果您只需要检查按下的键和鼠标状态(以及指针位置),您可以完全绕过事件(只在主循环中保留对 pygame.event.pump() 的调用)。 pygame.key.get_pressed 函数是我最喜欢的读取键盘的方式 - 它返回一个序列,其中有多少个键码,每个按下的键都有其相应的位置设置为 在此向量中为真。 (键码在 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 子句中,您可以在其中检查事件队列中的某些状态。

关于python - Pygame 事件队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8866096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com