经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
Cocos2d-x 学习笔记(11.2) RotateBy RotateTo
来源:cnblogs  作者:深潮  时间:2019/7/29 8:51:44  对本文有异议

1. RotateBy RotateTo

两个旋转方法。RotateBy是在当前角度上旋转设置的角度。RotateTo是直接旋转到设置的角度,方向遵循“就近原则”。两者没有相互继承关系。

1.1 成员变量

RotateBy成员变量:

  1. bool _is3D;
  2. Vec3 _deltaAngle; // 设置的角度
  3. Vec3 _startAngle; // 开始的角度

RotateTo成员变量:

  1. bool _is3D;
  2. Vec3 _dstAngle; // 设置的角度
  3. Vec3 _startAngle; // 开始的角度
  4. Vec3 _diffAngle; // 实际旋转的角度

1.2 create

RotateBy:

  1. // initWithDuration方法
  2. ActionInterval::initWithDuration(duration))
  3. _deltaAngle.x = _deltaAngle.y = deltaAngle;

RotateTo:

  1. // initWithDuration方法
  2. ActionInterval::initWithDuration(duration))
  3. _dstAngle.x = dstAngleX;
  4. _dstAngle.y = dstAngleY;

1.3 startWithTarget

RotateBy:

  1. ActionInterval::startWithTarget(target);
  2. if(_is3D)
  3. {
  4. _startAngle = target->getRotation3D();
  5. }
  6. else
  7. {
  8. _startAngle.x = target->getRotationSkewX();
  9. _startAngle.y = target->getRotationSkewY();
  10. }

_startAngle获取了当前的旋转角度。

RotateTo:

  1. if (_is3D)
  2. {
  3. _startAngle = _target->getRotation3D();
  4. }
  5. else
  6. {
  7. _startAngle.x = _target->getRotationSkewX();
  8. _startAngle.y = _target->getRotationSkewY();
  9. }
  10. calculateAngles(_startAngle.x, _diffAngle.x, _dstAngle.x);
  11. calculateAngles(_startAngle.y, _diffAngle.y, _dstAngle.y);
  12. calculateAngles(_startAngle.z, _diffAngle.z, _dstAngle.z);

除了获取当前角度,还调用了calculateAngles方法计算_diffAngle。

1.4 "就近原则":RotateTo的calculateAngles方法

首先把开始的角度对正负360度求余:

  1. if (startAngle > 0)
  2. {
  3. startAngle = fmodf(startAngle, 360.0f);
  4. }
  5. else
  6. {
  7. startAngle = fmodf(startAngle, -360.0f);
  8. }

然后计算diffAngle:

  1. diffAngle = dstAngle - startAngle;

diffAngle的值修改成“就近原则”后计算的新值:

  1. if (diffAngle > 180)
  2. {
  3. diffAngle -= 360;
  4. }
  5. if (diffAngle < -180)
  6. {
  7. diffAngle += 360;
  8. }

1.5 upate

RotateBy,我们设置的_deltaAngle就是旋转的角度:

  1. if (_startAngle.x == _startAngle.y && _deltaAngle.x == _deltaAngle.y)
  2. {
  3. _target->setRotation(_startAngle.x + _deltaAngle.x * time);
  4. }
  5. else
  6. {
  7. _target->setRotationSkewX(_startAngle.x + _deltaAngle.x * time);
  8. _target->setRotationSkewY(_startAngle.y + _deltaAngle.y * time);
  9. }

RotateTo,_diffAngle才是实际旋转的角度:

  1. if (_startAngle.x == _startAngle.y && _diffAngle.x == _diffAngle.y)
  2. {
  3. _target->setRotation(_startAngle.x + _diffAngle.x * time);
  4. }
  5. else
  6. {
  7. _target->setRotationSkewX(_startAngle.x + _diffAngle.x * time);
  8. _target->setRotationSkewY(_startAngle.y + _diffAngle.y * time);
  9. }

原文链接:http://www.cnblogs.com/deepcho/p/cocos2dx-action-rotateby-rotateto.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号