【问题标题】:Why does this code not clear mouse events from the SDL Events Poll?为什么这段代码不能从 SDL 事件轮询中清除鼠标事件?
【发布时间】:2021-04-23 20:52:03
【问题描述】:

我从其他 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_PumpEvents()打电话。”
  • @keltar 我尝试在刷新调用之前添加 SDL_PumpEvents() 但它仍然不起作用。
  • 您只清除用户事件类型的事件(在SDL_USEREVENTSDL_LASTEVENT 之间)。鼠标事件类型较低,因此不会被清除。您可以使用SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT) 清除所有内容。
  • @keltar 就是这样,谢谢你的帮助,你能把它放在答案表格中以便我接受吗?

标签: mouseevent sdl sdl-2


【解决方案1】:

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)) {}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2010-10-03
    • 2010-10-14
    • 2011-07-07
    • 2012-03-06
    相关资源
    最近更新 更多