SDL2 iOS多点触控未检测到第二根手指

问题描述 投票:1回答:1

我正在开发一个移植到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;
    }
}

这是发生的事情:

  1. 将第一根手指放在屏幕上(按住它)
  2. 首次触摸事件已注册
  3. 将第二根手指放在屏幕上。
  4. 没有注册第二次触摸,但多点触控手势事件被触发(我用printf捕获了这些)。

我发现一件有趣的事情是,如果我处理SDL_FINGERMOTION,两个触摸都会在正确的位置进行注册 - 但这不会起作用,因为它不会检测到单击,而是仅在手指移动时起作用。所以似乎多点触控正在工作,但也许我没有正确处理它。

以下是SDL_events.h的触摸事件

/* Touch events */
SDL_FINGERDOWN      = 0x700,
SDL_FINGERUP,
SDL_FINGERMOTION,

以下是事件流的示例。我放下1个手指,然后是一秒钟,然后抬起第一个,然后抬起第二个。

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

请注意,手指有很多动作 - 但只有一个手指向上和向下的事件。如果我稍后得到一些时间,我将使用屏幕上当前手指数的打印输出来更新它,以说明第二次手指向下事件永远不会被触发。

ios c sdl sdl-2
1个回答
0
投票

看看source code我看到SDL_SendTouch()应该被调用每个手指(NSEvent)发送到SDL_uikitview::touchesBegan处理程序(UIView的SDL子类)。我不太清楚UIKit在这里评论预期的行为,但你可以附加一个调试器,看看它是否达到预期的NSEvents数量。

如果NSEvents的数量和类型与您的预期不符,那么似乎SDL几乎无法做到。如果它们符合您的预期,那么它就会指向SDL中的错误。

具体来说,看看the sourceSDL_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         }
© www.soinside.com 2019 - 2024. All rights reserved.