为什么 pygame.event.get() 每帧只能调用一次



我正在编写一个函数,以便轻松检测按键,而无需使用通常使用的 for 循环:

for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == key:

我发现我编写的函数不起作用,这是因为我在运行每一帧的所有项目中都有这个test_for_quit函数。我发现这很有用,因为我可以将其复制到我正在编写的任何程序中:

def test_for_quit():
'''Shuts down the game if it's closed'''
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
pygame.quit()
sys.exit()

令人惊讶的是,这是我在所有程序中实现该功能以来制作的第一个不使用按键的游戏。但我发现我编写的新功能不起作用的原因pygame.event.get()已经在test_for_quit函数中调用了。

经过更多的测试,我发现这种方法不能调用两次,例如:

while True:
print(pygame.event.get())
print() #Leaves an empty line
print(pygame.event.get())

返回:

[<Event(17-VideoExpose {})>, <Event(16-VideoResize {'h': 600, 'size': (800, 600), 'w': 800})>, <Event(1-ActiveEvent {'gain': 0, 'state': 1})>, <Event(4-MouseMotion {'rel': (538, 315), 'pos': (537, 314), 'buttons': (0, 0, 0)})>]
[]

那么为什么pygame.event.get()只能调用一次,这真的引起了我的兴趣,我在互联网上找不到任何关于它的信息?

此外,我决定不再继续使用test_for_quit函数和key_down函数,而只使用传统的 for 循环。

event.get

可以根据需要多次调用。 问题是它确实将事件从事件队列中取出 - 并且由您的程序来使用它们。 当它被第二次调用而没有间隔时(pygame 本身对"帧"一无所知 - 你给出帧之间的延迟) - 所有事件都消失了,并且没有生成其他事件。

event.get的文档如下:

这将获取所有消息并将其从队列中删除。如果给定了类型或类型序列,则只会从队列中删除这些消息。

If you are only taking specific events from the queue, be aware that the queue could eventually fill up with the events you are not interested.

您有两种选择:保留对 event.get 的"复制并粘贴"调用,并使用其他调用(pygame.key.get_pressed一个调用)读取键盘状态,或者使用更智能的方式来使用队列中的事件。

甚至还有一些方法可以在不消耗它们的情况下检查事件队列中的 evetn - 因此您可以在调用events.get之前发出这些调用。

一是函数本身允许您指定您感兴趣的事件类型。因此,假设您有一个处理鼠标事件的函数和一个处理键栏事件的函数:

def do_keys():
for event in pygame.event.get(KEYDOWN):
...
def do_mouse():
for event in pygame.event.get((MOUSEMOTION, MOUSEBUTTONDOWN)):
..
def main():
while True:
do_keys()
do_mouse()
# discard other events:
pygame.event.get()
# draw secreen
...
pygame.time.delay(...)

或者,更简单的是,您可以简单地将pygame.event.get调用的返回值分配给一个变量 - 这将是一个列表,您可以根据需要多次迭代。

events = pygame.event.get()
for event in events():
# treat some evetns here
# some other logic here
...
do_keyboard_things(events)
def do_keyboard_things(events):
for event in events:
...

最新更新