由于 SDL2 的行为,我已经与一个 bug 斗争了几个小时,而我对此一无所知。
特别是,我不知道在移动设备上,每当用户触摸屏幕时,都会发送两个事件:
- 第一个对我来说非常明显:手指按下事件。
- 第二个确实不太明显:鼠标按钮按下事件。
这同样适用于手指向上/鼠标按钮向上事件。
因为他们,内部命令被抛出了两次,让我很头疼。
目标是支持移动和桌面环境,其原因超出了问题的目的。
另外,我可以猜测 SDL2 的工作原理是为了支持现有代码库的平滑迁移。
无论如何,是否有(让我说)SDL2-way 来抑制移动设备上的鼠标相关事件?
老实说,从我的角度来看它们没有多大意义,我想摆脱它们,除非软件在桌面环境上执行。
另外,我既不想使用编译时参数,也不想拥有专门的代码部分,其目的是抑制移动设备上的这些事件。
代码非常简单。下面是一个(可能)有意义的简化示例:
SDL_Event ev;
while(SDL_PollEvent(&ev)) {
switch(event.type) {
case SDL_FINGERDOWN:
// read it and throw an internal event E
break;
case SDL_MOUSEBUTTONDOWN:
// read it and throw an internal event E
break;
}
}
不幸的是,如上所述,当用户触摸屏幕时会读取上述两个事件。
* 编辑*
我没有提到我正在 Android 设备上测试我的应用程序,而且我很确定 iOS 上也会出现同样的问题。
请参阅下面的回复。看来这个问题确实主要是由于 SDL2 在 Android 上默认处理手指事件的方式造成的(到目前为止,我认为这不完全是一个问题)。
最佳答案
尽管我真的很喜欢 Christophe 添加事件过滤器的想法,但我发现 SDL2 已经gives support for this problem in terms of an hint在 Android 上。
特别是,存在提示SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH。
可以通过函数SDL_SetHint
来设置它。请参阅here了解更多详情。
很简单:
SDL_SetHint(SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH, "1");
根据提示文档,默认情况下它设置为 0
,这意味着:
mouse events will be handled as touch events and touch will raise fake mouse events
确实如此,这是我的问题,但是通过将其设置为 1
我们可以得到以下结果:
mouse events will be handled separately from pure touch events
因此,Android 设备上不再出现假鼠标事件。
我不太清楚默认值背后的原因,但这听起来确实是实现它的正确方法。
编辑(更多详细信息)
此更改似乎是最近发生的。
Here是 libsdl 论坛的链接,他们在其中讨论由于引入此行为的补丁而出现的问题。
有人遇到了与我相同的问题,其他一些人也试图解释为什么补丁被接受。
编辑:替代解决方案
提示SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH自SDL v2.0.4起可用,因此对于较低版本的SDL2来说唯一可行的解决方案似乎是使用事件过滤器。
无论如何,我不鼓励使用 SDL_GetPlatform
查询平台来决定是否设置事件过滤器。
相反,正如 SDL_MouseMotionEvent
的文档所示和 SDL_MouseButtonEvent
,存在 which
参数:
[...] may be SDL_TOUCH_MOUSEID, for events that were generated by a touch input device, and not a real mouse. You might want to ignore such events, if your application already handles SDL_TouchFingerEvent.
因此,我建议无论底层平台是什么,都设置一个事件过滤器,以便对事件进行排队或在需要时过滤它们。
关于c++ - 移动设备上的 SDL2 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34465681/