cocos2d-x v3.9 关于RotateTo和SkewTo的疑问
来源:互联网 发布:网络接口教程 编辑:程序博客网 时间:2024/05/19 14:18
最近在研究cocos2d-x v3.9的RotateTo时遇到了个问题,不知道是否算是Bug。
首先说一下我理解的RotateTo。RotateTo不关心精灵当前的角度,将精灵旋转至指定的角度。无论指定的角度是多少,最终旋转的角度一定在-360°~360°之间。进一步,我认为如果指定的角度为正角度则应按照顺时针方向将精灵旋转至指定角度;如果指定的角度为负角度,则应按照逆时针方向。
例如精灵的初始角度为0°,指定旋转角度为1090°,则实际应按照顺时针旋转10°(1090 % 360);又或者精灵的初始角度为0°,指定旋转角度为-591°,则实际应按照逆时针旋转231°(591 % 360)。
实际情况:比如精灵的初始角度均为0°。
1、
auto myRotateTo = RotateTo::create(3, 270);mySprite->runaction(myRotateTo);
效果:以逆时针旋转90°。
2、
auto myRotateTo = RotateTo::create(3, -181);mySprite->runaction(myRotateTo);
效果:以顺时针旋转179°。
看起来是遵循了就近原则,从当前角度到指定角度走了个最近路程。看一下源码:
void RotateTo::calculateAngles(float &startAngle, float &diffAngle, float dstAngle){ // 将startAngle更新为对360.0°求余的角度。 // 比如startAngle传进来是721.7°,更新后为1.7°。 if (startAngle > 0) { startAngle = fmodf(startAngle, 360.0f); } else { startAngle = fmodf(startAngle, -360.0f); } diffAngle = dstAngle - startAngle; // 得到目标角度与起始角度之间的差值。 if (diffAngle > 180) { diffAngle -= 360; } if (diffAngle < -180) { diffAngle += 360; }}
初步证实了,是就近原则那么个意思。如果顺时针的旋转角度大于180°了,那从逆时针方向转更近,逆时针方向的同理。
可真的是这样吗?继续测试。
3、
auto myRotateTo = RotateTo::create(3, 640);mySprite->runaction(myRotateTo);
效果:以顺时针旋转280°。如果遵循就近原则,应该按照逆时针旋转80°。
4、
auto myRotateTo = RotateTo::create(3, -541);mySprite->runaction(myRotateTo);
效果:以逆时针旋转181°。如果遵循就近原则,应该按照顺时针旋转179°。
5、
auto myRotateTo = RotateTo::create(3, 899);mySprite->runaction(myRotateTo);
效果:以顺时针旋转539°。这更没什么就近原则之说了,起码效果上是多转了一圈。
6、
auto myRotateTo = RotateTo::create(3, -731);mySprite->runaction(myRotateTo);
效果:以逆时针旋转371°。同上,没有就近原则之说,起码效果上多转了一圈。
**至此做个总结:
精灵的初始角度为0°,
当 -540° <= 指定的角度 <= 540°时,旋转遵循就近原则,旋转的角度在360°之内。
当 541° < 指定的角度 < 720° 或者 -720° < 指定的角度 < -541° 时,旋转不遵循就近原则,旋转的角度在360°之内。
当 指定的角度 >= 720° 或者 指定的角度 <= -720° 时,旋转的角度在360°之外,即起码多旋转了一圈,也就无法谈及是否遵循就近原则了。**
如果按照我理解的RotateTo,RotateTo::calculateAngles()应该是如下形式:
void RotateTo::calculateAngles(float &startAngle, float &diffAngle, float dstAngle){ diffAngle = fmodf(dstAngle, 360) - fmodf(startAngle, 360); diffAngle = fmodf(diffAngle, 360); if(((diffAngle < 0) && (dstAngle >= 0)) || ((diffAngle > 0) && (dstAngle < 0))) { if(diffAngle > 0) diffAngle -= 360; else diffAngle += 360; } return ;}
SkewTo在计算变化角度的时候也有同样的问题。此外,SkewTo在对X轴的变化角度取余的时候为何对180°求余?
if (_startSkewX > 0){ _startSkewX = fmodf(_startSkewX, 180.f); // 180°?}else{ _startSkewX = fmodf(_startSkewX, -180.f); // 180°?}
这样会导致问题。举个简单的例子,比如我让X轴从181°变换到191°,
sprite->setSkewX(181);auto skewto = SkewTo::create(3, 191, 0);sprite->runAction(skewto);
本意只是想让X轴沿顺时针方向变化10°,单实际的效果是X轴沿逆时针方向变化了170°。
- cocos2d-x v3.9 关于RotateTo和SkewTo的疑问
- cocos2d-x实例学习(5)之SkewTo&SkewBy
- cocos2d-x实例学习(3)之RotateTo&RotateBy
- Cocos2d-x v3.9发布
- cocos2d-x v3.9 与MoveBy和MoveTo之间的对话
- Cocos2d-x V3.0 Sprite 和 SpriteBatchNode
- Cocos2d-x v2和v3对照手册
- cocos2d-x v2 和 v3 对照手册
- cocos2d-x v2 和 v3 对应手册
- Cocos2d-x v3.3的颜色混合BlendFunc
- Cocos2d-x 3.0final -关于V3中CallFunc::create的新的使用方法
- Cocos2d-x 3.0-关于V3中CallFunc::create的新的使用方法
- Cocos2D v3.x中关于重叠触摸层优先级的问题
- Cocos2d-html5之SkewTo&SkewBy
- [Cocos2d-x v3.x]EditBox和ControlSlider控件应用
- Cocos2d-html5之RotateTo&RotateBy
- Cocos2d-x v3.3 关于Scale9Sprite调用报错。。。
- Cocos2d-x v3.X的颜色混合BlendFunc使用详解
- java ftp工具类
- Android 蓝牙(概述)
- 实验1.1
- 对js中的引用类型的理解(5)——Date类型
- ios 中键盘自动隐藏
- cocos2d-x v3.9 关于RotateTo和SkewTo的疑问
- nginx 快速搭建
- Shell脚本:求命令行上所有的整数和
- Android Studio adb无法响应的解决方法
- 前端开发者都应知道的 jQuery 小技巧
- Cocos2dx-OpenGL ES2.0教程:纹理贴图(6)
- 工程问题:fatal error C1071
- 基金基础知识
- 参考文献中的字母含义