首页 > 解决方案 > 检查 pygame 事件队列中的特定事件

问题描述

我希望能够检查 pygamepygame.USERVENT+1中用户定义的事件是否具体。我有我的主循环,其中一个窗口被填充并且东西被绘制到窗口。我还有一个 for 循环来检查诸如退出或调整窗口大小之类的事件。然后我有一个我称之为调用的函数draw_cursor()。我正在尝试检查pygame.USEREVENT+1此函数中的特定事件,以便可以使用它来绘制对象但是如果不使用主函数中的事件队列来检查是否在事件队列中,我似乎无法获取此事件pygame.USERVENT+1

import pygame

pygame.init()

width, height = 1024, 648
window = pygame.display.set_mode((width, height), pygame.RESIZABLE)

pygame.time.set_timer(pygame.USEREVENT, 1000)

def display_cursor():
    if pygame.event.poll().type == pygame.USEREVENT+1:
        print("This should print when USERVENT is in the event queue")

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        if event.type == pygame.VIDEORESIZE:
            width, height = event.w, event.h
            window = pygame.display.set_mode((event.w, event.h), pygame.VIDEORESIZE)
        """if event.type == pygame.USEREVENT+1:
            print("This will print when USEREVENT in the event queue")"""

    display_cursor()

    window.fill((0,0,255))

    pygame.display.flip()

注释掉的部分pygame.USERVENT+1是在事件队列中时实际打印的部分。我使用pygame.event.poll().type它以数字形式返回事件,而 pygame.USERVENT+1 是数字 24。我认为这会起作用,因为它应该在事件队列中pyame.event.poll().type返回数字 24 。pygame.USEREVENT+1我还查看了:https ://www.pygame.org/docs/ref/event.html#pygame.event.peek以类似的方式检查事件是否在事件队列中。我试过if pygame.event.peek(pygame.USEREVENT+1):而不是if pygame.event.poll().type == pygame.USEREVENT+1:它仍然没有打印出我想要它做什么。

我希望能够pygame.USERVEENT+1仅在此display_cursor()函数中检查特定事件,并且我没有pygame.event.get()在 for 循环中使用只是为了检查一个事件,因为我发现它会使我的程序减慢到窗口几乎没有响应的程度。有没有一种方法可以让我只在一个单独的函数中检查用户定义的事件,而不必将事件对象传递给这个函数来阻止它变慢?是否还有我缺少的参数或类似功能完全符合我的想法pygame.event.poll()pygame.event.peek()所做的?

标签: pythonpython-3.xpygame

解决方案


pygame.event.get()获取所有消息并将它们从队列中删除。pygame.event.get()调用后队列中没有更多消息。因此几乎总是返回inpygame.event.poll()类型的事件对象。pygame.NOEVENTdisplay_cursor

您需要display_cursor在事件循环中调用。事件必须是函数的参数:

def display_cursor(event):
    if event.type == pygame.USEREVENT+1:
        print("This should print when USERVENT is in the event queue")

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        if event.type == pygame.VIDEORESIZE:
            width, height = event.w, event.h
            window = pygame.display.set_mode((event.w, event.h), pygame.VIDEORESIZE)
        """if event.type == pygame.USEREVENT+1:
            print("This will print when USEREVENT in the event queue")"""
        display_cursor(event)

或者,您可以获取事件列表并将事件列表传递给函数:

def display_cursor(event_list ):
    for event in event_list :
        if event.type == pygame.USEREVENT+1:
            print("This should print when USERVENT is in the event queue")

while True:
    event_list = pygame.event.get()
    for event in event_list:
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        if event.type == pygame.VIDEORESIZE:
            width, height = event.w, event.h
            window = pygame.display.set_mode((event.w, event.h), pygame.VIDEORESIZE)
        """if event.type == pygame.USEREVENT+1:
            print("This will print when USEREVENT in the event queue")"""
        
    display_cursor(event_list)

另请参阅pygame.event.get() 的更快版本

如果您正在寻找更细微的方法,请参阅Pygame: how to write event-loop polymorphically


推荐阅读