c++ - 移动设备上的 SDL2 事件

标签 c++ mobile sdl sdl-2 mobile-application

由于 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_TOUCHSDL 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/

相关文章:

c++ - SDL 击键增量计数器

c++ - 使用 QTimeline 制作动画

c++ - C++/SDL/OpenGL 中的平滑动画问题

c++ - 为什么我的程序在打开 mkfifo-ed 管道时挂起?

linux - 移动宽带Sierra Gobi 3000驱动程序在内核3.2下编译

android - 如何开始处理移动恶意软件?

css - m.subdomain - 我的理解正确吗?

c# - 使用 CLR C++ 包装器从 C# 应用程序在 C++ 中加载 SDL 窗口不起作用

c++ - Bjarne Stroustrup 的 c++ 书中的这个例子有什么问题

c++ - 使用原始指针或智能指针在 C++ 中组合?