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 维度上移动)。
所以,就是这样。
我正在开发 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 维度上移动)。
所以,就是这样。