[BUG反馈] [2.2.0] [提供 demo] SpriteFrame Clone 出错

Demo:
spriteFrame_clone_bug.zip (837.1 KB)

const { ccclass, property } = cc._decorator;

@ccclass
export default class Helloworld extends cc.Component {

    @property(cc.SpriteFrame) frame: cc.SpriteFrame = null;

    onClone() {
        console.log(this.frame.getRect());
        let node = new cc.Node();
        let sprite = node.addComponent(cc.Sprite);
        sprite.spriteFrame = this.frame.clone();
        cc.find('Canvas').addChild(node);
    }

}

每次 clone 并赋值给新节点的 spriteFrame 后,原 frame 的 rect 就会发生改变,再次点击,会在改变的基础上再次改变。克隆出来的精灵纹理会显示异常。

SpriteFrame不用克隆直接赋值。克隆反而有内存泄露风险

骨骼动画,需要克隆插槽上的纹理。
不克隆直接赋值,骨骼上的纹理就消失了。:joy:

遇到同样的问题 2.3.3版本,遍历node的树节点,因为需要把节点的texture flipX复制一套,结果原来的node.sprite显示出错了,flipX的新node也没有正常显示。

奇怪的是,直接使用new SpriteFrame(old的参数)又能正常复制了。不知道 什么回事。如果场景只有一个节点为,clone这个结点的spriteframe是没有问题的,就是在含 多个节点的节点树里做clone操作就会显示出错。

先确定 SpriteFrame 是不是共享资源,改动的可能是共用的 SpriteFrame 对象。

以下就是全部代码,typescript
export function recrusiveFlipX(node :cc.Node){
node.x = -node.x;
let sprite:cc.Sprite = node.getComponent(cc.Sprite);
if(sprite){

    let old:cc.SpriteFrame = sprite.spriteFrame;
    let newSpriteFrame:cc.SpriteFrame;
    // 把以下一句改为newSpriteFrame= old.clone(); 就会显示出错
    newSpriteFrame= new cc.SpriteFrame(old.getTexture(), old.getRect(), old.isRotated(), old.getOffset(), old.getOriginalSize());  
    newSpriteFrame["_uuid"] = old["_uuid"];
    newSpriteFrame.name = old.name;
    sprite.spriteFrame = newSpriteFrame;
    sprite.spriteFrame.setFlipX(true);

}
if(node.children && node.children.length){
node.children.map(child =>recrusiveFlipX(child));
}
}