python - 检查 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()
所做的?
解决方案
pygame.event.get()
获取所有消息并将它们从队列中删除。pygame.event.get()
调用后队列中没有更多消息。因此几乎总是返回inpygame.event.poll()
类型的事件对象。pygame.NOEVENT
display_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: how to write event-loop polymorphically
推荐阅读
- javascript - 按用户从图中以 JSON 格式获取数据
- java - 如何根据 Java 8 中的某些条件更新现有对象 可选
- mongodb - 如何在mongodb的对象数组中查找具有不同顺序的数据?
- python - 无法在 OpenCV 中使用 SIFT 功能
- swift - 折线未连接到第一个点
- php - 存储在 HTML 表单中选择的选项的变量中
- php - filter() 集合在子查询中不起作用
- vuetify.js - Vuex:发生突变但状态没有改变
- sql - 从 SQL 表中选择列表中的第一个匹配字符串值
- singlestore - 是否可以创建一个由特定 JSON 值数组组成的 PERSISTED 列,如果可以,如何创建?