2.2.0 rotateTo BUG

执行
node.angle=22;
node.runAction(cc.rotateTo(1.0, -22));
预期应该是从22度顺时针转到-22度(338度),然而什么也没有发生。

测试代码见附件BTest.zip (246.9 KB)

执行
node.angle=22;
node.runAction(cc.rotateTo(1.0, 338));
也一样
angle逆时针?rotateTo顺时针?也没找到angleTo的替代函数啊

测试了下论坛里面的v2.2.1没问题,你验证下看是否是你的预期?

我用2.2.1alpha-5,用这个帖子附件demo,就输入从22旋转到-22,还是有问题,而且模拟器浏览器都有问题。请问你是怎么测的?输入的是两个相反数吗?

看了下源码rotateTo的这函数有问题

startWithTarget:function (target) {
    cc.ActionInterval.prototype.startWithTarget.call(this, target);

    let startAngle = target.angle % 360;

    let angle = cc.macro.ROTATE_ACTION_CCW ? (this._dstAngle - startAngle) : (this._dstAngle + startAngle);
    if (angle > 180) angle -= 360;
    if (angle < -180) angle += 360;

    this._startAngle = startAngle;
    this._angle = cc.macro.ROTATE_ACTION_CCW ? angle : -angle;
},

let angle = cc.macro.ROTATE_ACTION_CCW ? (this._dstAngle - startAngle) : (this._dstAngle + startAngle);这一句,为什么计算角度差顺时针要用加法?不应该都用减法,顺时针逆时针只是正负关系。从22转到-22一加就变0了。
另外this._dstAngle没有归一化到360以内,导致后面两句 if (angle > 180) angle -= 360; if (angle < -180) angle += 360;没什么意义。

试一下这个 pr:
https://github.com/cocos-creator/engine/pull/5717

没测出问题来

看了pr感觉有点蒙,为什么取反就可以了?
首先我rotateTo传的值是目标angle,因为没有叫angleTo的API,按rotateTo的注释,传的应该是angle而不是废弃的rotation
其次,假设按你的改法,cc.macro.ROTATE_ACTION_CCW的值用户是可以改的,我把cc.macro.ROTATE_ACTION_CCW改为true,执行node.angle=22;node.runAction(cc.rotateTo(1.0, 22));
预期是什么都不发生,因为目标角度和初始角度一样。但实际上let angle = cc.macro.ROTATE_ACTION_CCW ? (this._dstAngle - startAngle) : (this._dstAngle + startAngle);这一句因为this._dstAngle被取反,angle会计算出-44的错误值。

是否应该改成let angle = cc.macro.ROTATE_ACTION_CCW ? (this._dstAngle - startAngle) : (startAngle - this._dstAngle);

咨询一下,旧版的动作api是否要逐步废弃,改用新的tween来做动画?

建议用 tween 吧,tween 更强大而且也方便维护

嗯,你说的没错。

其实我第一次的修改,思路与你是一致的。

this.dstAngle + startAngle

startAngle - this.dstAngle

差别在 dstAngle 是否取反。
我当时没有考虑到用户改变转向之后会导致的问题,这很抱歉。
现在已经修改。

2.2.2版本的cc.rotateTo 和2.2.0和方向相反:joy:

我看下问题。

现在这个效果是正确的,现在你在编辑器中增加节点的 rotation 呈现的旋转效果,才是正确的。

2.1 版本方向搞反了,旧项目升级上来后,行为会保留一致,以免破坏兼容性。总之,我们会尽量保证和升级前的行为一致,不论之前的行为是不是反的。
如果是新建的项目,则不会有问题。

是你的问题吧 input里面你输入了吗

node.angle = 22 与 node.runAction(cc.rotateTo(-22)) 的最终效果是一致的。
我之前的这个 PR 是错误的。
我建议你把

node.angle = start_degree 

换成

node.runAction(cc.rotateTo(0, start_degree))