今天无意中发现了一个问题,当设置完节点的旋转信息(setRotation)后马上获取节点的旋转信息(getRotation),经常会报错
(Assert failed: CCNode#rotation. RotationX != RotationY. Don't know which one to return),报错的大意就是rotationX不等于rotationY,所以它就不知道该返回多少了,然后我就去查阅了一下引擎的源代码,发现getRotation实现如下:
/// rotation getter
float Node::getRotation() const
{
CCASSERT(_rotationZ_X == _rotationZ_Y, "CCNode#rotation. RotationX != RotationY. Don't know which one to return");
return _rotationZ_X;
}
果然如此,当rotationX不等于rotationY的时候就报错了,那为啥会出现rotationX不等于rotationY呢?好吧,只能再去看看setRotation的源代码了,然后发现setRotation实现如下: /// rotation setter
void Node::setRotation(float rotation)
{
if (_rotationZ_X == rotation)
return;
_rotationZ_X = _rotationZ_Y = rotation;
_transformUpdated = _transformDirty = _inverseDirty = true;
#if CC_USE_PHYSICS
if (!_physicsBody || !_physicsBody->_rotationResetTag)
{
updatePhysicsBodyRotation(getScene());
}
#endif
}
看了一下,注意里面这句话: _rotationZ_X = _rotationZ_Y = rotation,问题就出现在这里,其实这句话可以拆开这样写,作用和效率是一样的: _rotationZ_Y = rotation; _rotationZ_X = rotation ; 我们都知道计算机指令的执行是需要时间的,当它执行完 _rotationZ_Y = rotation的时候你就去取rotation的值,就必然会出现rotationY不等于 rotationX的情况,所以解决方法就是我们不使用getRotation函数,我们使用getRotationX函数(用getRotationY也可以),就可以避免上述问题了。 看起来似乎是问题解决了,但是,其实还是有问题的,我经过暴力测试后发现还有这么一个问题,getRotationX获取到的值会是NaN的情况(在极端情况下会出现这种情况),唉,这问题咋整呢,获取一次有问题,那就多获取几次,直到获取到的是正确的呗 so,接下来就拓展引擎的源代码,示例代码如下: // 获取节点的旋转信息
// 拓展原因:
// 1. 刚设置完节点旋转信息setRotation,立即获取节点旋转信息getRotation,经常会出现rotationX不等于rotationY而引起的报错
// 解决方法:直接getRotationX就好了
// 2. 获取节点旋转信息getRotationX经常会出现得到的rotation是NaN的结果
// 解决方法: 用do - while语句获取rotation,直到获取的rotation不是NaN
cc.Node.prototype.getNodeRotation = function () {
var rotation;
do {
rotation = this.getRotationX();
} while (rotation === NaN);
return parseFloat(rotation);
};
这样以后我们要获取节点的旋转信息,直接调用getNodeRotation函数就可以了,这样整完后我又经过了大量的暴力测试,发现效果非常棒,稳定性非常好 |
小谈Cocos2d-JS中的getRotation()函数
最新推荐文章于 2023-11-23 17:16:55 发布