小谈Cocos2d-JS中的getRotation()函数

本文详细解析了CCNode旋转获取错误的原因,并通过修改代码实现了更稳定可靠的旋转获取方法。通过改进getRotation函数,确保了在设置旋转后立即获取时不会出现rotationX不等于rotationY的问题。此外,还提供了一种处理获取到NaN值的解决方案,通过循环获取直至得到正确结果。最后,展示了一个优化后的getNodeRotation函数,显著提高了旋转信息获取的稳定性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天无意中发现了一个问题,当设置完节点的旋转信息(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函数就可以了,这样整完后我又经过了大量的暴力测试,发现效果非常棒,稳定性非常好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值