CCTouchesMoved 在 Cocos2d-x 的单次点击中多次调用

CCTouchesMoved called multiple times on single Tap in Cocos2d-x

我正在开发 Cocos2d-x 内置的游戏,在 iPhone 6S Plus 上进行测试之前一切顺利。在这个特定的设备上,CCTouchesMoved 即使在单击事件中也会被多次调用,而它在其他 iOS 设备上工作正常,你能帮我解决我遗漏的问题吗?或者 iPhone 6S plus 中有什么变化吗?

void CCLayerPanZoom::ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent) {
  CCLOG("CCLayerPanZoom::ccTouchesBegan");
}
void CCLayerPanZoom::ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent) {
 CCLOG("CCLayerPanZoom::ccTouchesMoved");
}

在这里,ccTouchesMoved 被多次调用,这不是正常行为,也不会发生在其他 iOS 设备上。

我找到了答案here

随着 iPhone 6s /6s plus 的推出,引入了一项名为“3D Touch”的新技术。当我拿到新的 iPhone 6s 的那天,我在上面测试了我的游戏。

一切对我来说都很好,但是: 1. 有时触摸事件是行不通的。 2. 有时触摸事件工作起来很荒谬。

经过一周的问题排查,我终于发现: 即使 2D 中的触摸位置没有改变,有时也会调用 'onTouchMoved' 的函数。是的,触摸位置现在是 3D 的。并且 z 维度上的触摸位置非常敏感(与 x 和 y 维度上的触摸位置相比)。手指在屏幕上施加的一个非常小的力可能会导致触摸位置在 z 维度上发生变化,并使游戏引擎 (cocos2d-x) 调用 'onTouchMoved'.

的函数

但是cocos2d-x的最新版本(截至本主题post日:2015/10/25)还没有支持3D Touch。所以你无法访问 z 维度,但会被它打扰。如果您的任何游戏逻辑只关心触摸位置是否在 2D 中发生变化,则 'onTouchMoved' 的功能不再可靠。这是我的解决方案:

警告您的玩家轻轻触摸屏幕以避免 z 维度中触摸位置的变化皱眉

或者,您可以添加如下代码来避免 'onTouchMoved' 函数中的代码被意外调用:

void CCLayerPanZoom::ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent) {
CCPoint point1 = touch->getLocation();
CCPoint point2 = touch->getPreviousLocation();
if (point1.equals(point2)) {
    return;
}
 CCLOG("CCLayerPanZoom::ccTouchesMoved");
}

getLocation() 或 getPreviousLocation() returns Vec2 值,因此您可以非常安全地消除 触摸力参数的干扰情况(触摸在 z 维度上移动)。

所以,就是这样。