未检测到SDL2 iOS多点触控秒针向下

未检测到SDL2 iOS多点触控秒针向下,ios,c,sdl,sdl-2,Ios,C,Sdl,Sdl 2,我正在从事一个SDL2项目,我已经将其移植到iOS。 我在注册2次触屏以用作游戏控件时遇到问题 控件的工作方式如下: iOS Device +---------------+ | F | | | |-------| L | R | | B | | | +---------------+ F-前进 B-向后移动 L-左转 R-右转 玩家应该能够同时向前移动和转身——这意味着我必须同时处理两个单独的触摸,而不是多点触摸手势 下面是在我的项目中执行此操作的代码示例 w

我正在从事一个SDL2项目,我已经将其移植到iOS。 我在注册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;
    }
}
下面是事件流的一个示例。我放下一个手指,然后是第二个,然后举起第一个,然后举起第二个

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
请注意,有很多手指运动-但只有一个手指上下活动。如果过一段时间后,我会用屏幕上当前手指数的打印输出来更新它,以说明second finger down事件从未触发

查看我看到
SDL\u SendTouch()
应该为发送到
SDL\u uikitview::touchesbreated
处理程序的每个手指(
UIView
)调用
SDL\u SendTouch()。我对UIKit的记忆不足,无法在此评论预期的行为,但您可以附加一个调试器,亲自查看它是否获得预期数量的
n事件

如果
n事件的数量和类型与您期望的不匹配,那么SDL似乎无能为力。如果它们和您期望的一样,那么它指向SDL中的一个bug

具体来说,请将SDL_SendTouch作为放置断点的另一个位置。在一些情况下,该功能可以解除:

   228 SDL_Touch* touch = SDL_GetTouch(id);
   229     if (!touch) {
   230         return -1;
   231     }
   232 
   233     finger = SDL_GetFinger(touch, fingerid);
   234     if (down) {
   235         if (finger) {
   236             /* This finger is already down */
   237             return 0;
   238         }
   239 
   240         if (SDL_AddFinger(touch, fingerid, x, y, pressure) < 0) {
   241             return 0;
   242         }
228 SDL\u Touch*Touch=SDL\u GetTouch(id);
229如果(!触摸){
230返回-1;
231     }
232
233 finger=SDL_GetFinger(触摸,fingerid);
234如果(向下){
235如果(手指){
236/*这个手指已经放下了*/
237返回0;
238         }
239
240如果(SDL_添加手指(触摸、手指ID、x、y、压力)<0){
241返回0;
242         }

据我所知,SDL多点触控/手势是基于之前的fingerdown/move/up事件处理的,因此不太可能出现多点触控事件,但不会出现第二次figerdown。可能是您的问题实际上是您对所述事件的反应方式有问题吗?您能在fingerdown事件上打印F转储完整的tfinger状态,在mu上打印mgesture状态吗ltitouch事件,并将结果附加到问题?我在问题中添加了一个示例事件流。我做了进一步的测试。我发现,如果我在事件轮询循环中调用
SDL\u gettouchinger
,我可以独立检测两个手指。如果我无法使手指向上/向下事件工作,我将使用此方法。您尝试过构建吗从最新的来源?这确实感觉像一个bug,特别是考虑到你确实得到了
SDL\u FINGERMOTION
。如果你有触摸板,你也可以尝试用你的Mac电脑进行测试。或者可能是安卓设备?
   228 SDL_Touch* touch = SDL_GetTouch(id);
   229     if (!touch) {
   230         return -1;
   231     }
   232 
   233     finger = SDL_GetFinger(touch, fingerid);
   234     if (down) {
   235         if (finger) {
   236             /* This finger is already down */
   237             return 0;
   238         }
   239 
   240         if (SDL_AddFinger(touch, fingerid, x, y, pressure) < 0) {
   241             return 0;
   242         }