为什么此代码不清除 SDL 事件轮询中的鼠标事件?

Why does this code not clear mouse events from the SDL Events Poll?

我从其他 Whosebug 问题中找到了一些代码,但基本上在我的代码中我 运行 和 SDL_Delay 并且我不希望在此延迟期间注册任何鼠标事件,但是他们仍然是我 运行 这个代码:

SDL_FlushEvents(SDL_USEREVENT, SDL_LASTEVENT);
SDL_PollEvent( &event );
event.type = SDL_USEREVENT;
event.button.x = 0;
event.button.y = 0;

但即使在下一个 SDL_PollEvent(&event) 之后的这段代码之后,鼠标弹起事件也会被注册。我该如何解决这个问题并阻止这些鼠标事件被注册?

SDL_FlushEvents 仅清除当前在 SDL 队列中的事件。事件通过 SDL_PumpEvents 调用(由 SDL_PollEvent 内部调用)放入队列。此外,in 清除指定类型范围内的事件。如所讨论的那样,它仅清除“用户事件”类型的事件(值高于 SDL_USEREVENT 的每种类型都可用作用户事件类型)。要清除所有事件,您要清除类型 [0, MAX],或特殊别名 SDL_FIRSTEVENT (0) 和 SDL_LASTEVENT(事件类型可以取最大值)。

总结一下:

SDL_PumpEvents();
SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT);

如果需要,您可以在SDL_event.h 文件中检查事件类型的实际值。如果您只想清除鼠标事件,例如SDL_FlushEvents(SDL_MOUSEMOTION, SDL_MOUSEMOTION+0x50).

另一种方法是处理整个事件队列直到它为空 - 例如

while(SDL_PollEvent(NULL)) {}