节点翻转设置scale为-1带来的BUG

例如,用代码对游戏里的主角做了缩放,值为1-2之间,具体值在运行时动态确定。然后死亡动画是用Creator编的一个序列帧动画,因为动画需求要翻转,所以在序列帧动画中把scaleX设为了-1。这就导致了一个问题,主角活着时是正常放大的,但死亡时就会突然缩小,因为死亡动画中设置了-1。我期望的是主角一直保持同样的缩放,在死亡时只是做个翻转,而不要影响到缩放值。

请问这个该怎么解决呢?

包多一层呗

这意味着节点的结构变了,代码也要变,而且这类节点比较多,改动的工作量还是不小的。

不知有没有更好的方案?

Creator把flip和scale合并到一个属性上,目的是什么?难道是为了节省编辑器面板的空间么?:joy:

那就在转变之前把当前x,y的缩放保存下?缩放到-x,-y类似这样。flip没怎么用,我都是习惯用scaleTo加skewTo做的翻转

角色直接改宽高就不会和翻转冲突了

那需要在update里检测每一帧的scale变化,只是为了处理一个本不应该存在的问题,实在是很蛋痛的代码。。。

flip是cocos以前版本引擎的node属性。

是说在代码里直接设宽高吗?scale缩放值是在运行时动态确定的,事前不知道,也没法在编辑序列帧动画时提前设定好。

之前怎么改scale的就换成改宽高啊,不需要提前知道

这个方法不行,有两个问题:
1 死亡序列帧动画里Sprite的SizeMode是RAW,它又会把Size改成原始大小;
2 直接设node的Size只对本节点有效,对子节点无效。而scale是包含所有子节点;

每一帧检测?怎么说,角色执行死亡动画过程他自身缩放还在改变?而不是执行死亡动画前的时候缩放已经定了吗,也就是你说的不同状态下的缩放,那个时候缩放不是有了确定值?

对,在执行死亡动画时缩放值已经确定了,比如1.8。

我在update中每帧做了检测,如果发现是-1,就强行改为-1.8,但试了发现不行,在播放死亡动画时仍然缩小了。

做动画是有过渡的,你判断他为1的时候就已经发生了过渡(缩放),当然没用了老铁

为什么要在每帧检测发现是-1改为-1.8呢?为什么不直接翻转到-1.8?

update都不行的话,还能放在哪呢?

因为什么时候死亡是不确定的啊,你意思是在播放动画前设置大小吗?像这样:

node.setScale(1.8); // 在这里?但此时动画并没有真正开始播放。
animation.play(‘dead’, …);

总结一下问题大概这样,我在Sprite初始化时setScale(1.8),然后在播放序列帧动作时,因为动画编辑器里定义了scale为-1,结果是造成sprite变小了。

我期望是播放动画时能够翻转,但不要改变我的缩放比例。所以我想在动画设置scale为-1时我能检测到,然后自行修改scale为-1.8,但目前看起来在update里检测也不行。

最好是Creator能够把翻转属性独立出来,不要和scale混一起。不然看似节省了一个属性,但带来了很多不必要的麻烦。

@jare

外边套个节点,scale设为1.8

这不是bug,正常就是这样,你动画修改scale必然会影响你之前设置的scale,想不影响就再套一层节点或者让美术做翻转图用换资源的方式翻转

这样改变了节点结构,代码也要改,而且要修改的节点比较多,工作量不小。

如果没有更好方案,我也只能这样了。

不对,这是因为翻转占用了scale属性引起的问题。

如果翻转是个独立属性,那在Creator里编辑动画时只要引用Flip属性(cocos2dx版本中Flip代表翻转),不需要引用scale属性,也就不会引起scale的变化。