我正在研究已移植到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个手指向上和向下事件。如果过一会儿,我将在屏幕上以当前手指的打印输出进行更新,以说明从未触发第二次手指按下事件。
答案 0 :(得分:0)
看着source code,我发现应该发送给SDL_SendTouch()
处理程序({{1}的SDL子类)的每个手指(NSEvent
)调用SDL_uikitview::touchesBegan
}。我对UIKit不够记得,无法在此处评论预期的行为,但是您可以附加调试器,并亲自查看调试器是否达到预期的UIView
数量。
如果NSEvents
的数量和类型与您期望的不符,那么SDL似乎无能为力。如果它们符合您的期望,则表明SDL中存在错误。
具体地说,将NSEvents
的{{3}}视为放置一些断点的另一个地方。在某些情况下,该功能可以纾困:
SDL_SendTouch