【发布时间】:2019-02-16 02:36:35
【问题描述】:
我正在开发一个已移植到 iOS 的 SDL2 项目。 我在注册 2 次触摸以用作游戏控件时遇到问题。
控件的工作方式如下:
iOS Device
+---------------+
| F | | |
|-------| L | R |
| B | | |
+---------------+
F - 前进
B - 向后移动
L - 左转
R - 右转
玩家应该能够同时向前移动和转动——这意味着我必须同时处理两个单独的触摸,而不是多点触控手势。
这是在我的项目中执行此操作的代码示例。
while (SDL_PollEvent(&event)) {
printf("event %#010x\n", event.type);
switch (event.type) {
case SDL_FINGERDOWN:
//case SDL_FINGERMOTION:
if (event.tfinger.x < 0.5) {
lastMoveFinger = event.tfinger.fingerId;
isMoving = true;
if (event.tfinger.y < 0.5) {
mvForward = true;
} else {
mvForward = false;
}
} else {
lastTurnFinger = event.tfinger.fingerId;
isTurning = true;
if (event.tfinger.x < 0.75) {
turnRight = false;
} else {
turnRight = true;
}
}
break;
case SDL_FINGERUP:
if (event.tfinger.x < 0.5 || event.tfinger.fingerId == lastMoveFinger) {
lastMoveFinger = -1;
isMoving = false;
} else {
lastTurnFinger = -1;
isTurning = false;
}
break;
}
}
会发生什么:
- 将第一根手指放在屏幕上(按住不放)
- 注册第一个触摸事件
- 将第二根手指放在屏幕上。
- 没有注册第二次触摸,但触发了多点触控手势事件(我使用
printf捕获了这些事件)。
我发现一个有趣的事情是,如果我处理 SDL_FINGERMOTION 两个触摸都注册在正确的位置 - 但这不起作用,因为它不会检测到单次点击,而是仅在手指移动时起作用。所以看起来多点触控正在工作,但也许我没有正确处理它。
这里是来自SDL_events.h的触摸事件供参考
/* Touch events */
SDL_FINGERDOWN = 0x700,
SDL_FINGERUP,
SDL_FINGERMOTION,
这是事件流的示例。我放下一根手指,然后放下第二根手指,然后举起第一根,然后举起第二根。
event 0x00000401
event 0x00000700 // Finger down
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000802
event 0x00000702
event 0x00000802
event 0x00000402
event 0x00000701 // Finger up
请注意,有很多手指运动 - 但只有 1 个手指向上和向下事件。如果稍后有时间,我将使用屏幕上当前手指数的打印输出来更新它,以说明第二个手指向下事件永远不会触发。
【问题讨论】:
-
据我所知,SDL 多点触控/手势是根据之前的手指向下/移动/向上事件处理的,因此您不太可能获得多点触控事件但没有第二次手指向下。会不会是您的问题实际上出在您对所述事件的反应方式上?你能打印f-dump full tfinger state on fingerdown event 和 mgesture state on multitouch event,并将结果附加到问题吗?
-
我在问题中添加了一个示例事件流。我做了进一步的测试。我发现如果我在事件轮询循环中调用
SDL_GetTouchFinger- 我可以独立检测到两个手指。如果我无法让手指向上/向下事件起作用,我将改用这种方法。 -
您是否尝试过从最新源构建?这确实感觉像是一个错误,特别是考虑到您确实得到了
SDL_FINGERMOTION。如果您有触摸板,您也可以尝试使用 Mac 进行测试。或者可能是 Android 设备?