执行
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, -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感觉有点蒙,为什么取反就可以了?
首先我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和方向相反
我看下问题。
现在这个效果是正确的,现在你在编辑器中增加节点的 rotation 呈现的旋转效果,才是正确的。
2.1 版本方向搞反了,旧项目升级上来后,行为会保留一致,以免破坏兼容性。总之,我们会尽量保证和升级前的行为一致,不论之前的行为是不是反的。
如果是新建的项目,则不会有问题。
node.angle = 22 与 node.runAction(cc.rotateTo(-22)) 的最终效果是一致的。
我之前的这个 PR 是错误的。
我建议你把
node.angle = start_degree
换成
node.runAction(cc.rotateTo(0, start_degree))