为什么此代码没有从SDL事件轮询中清除鼠标事件



我从其他StackOverflow问题中找到了一些代码,但基本上在我的代码中,我运行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清除指定类型范围内的事件。正如所讨论的那样,它只清除类型为"0"的事件;用户事件";(值高于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)) {}

最新更新