cocos creator 切换场景内所有同名节点图片

写了一个用于切换当前场景内所有同名节点图片的函数,可以直接使用,直接上代码

let sceneSprite = new Map();//用于缓存不同场景下的精灵组件
    /**
     * @description: 在当前场景下,用于更改节点的spriteFrame,把所有同名节点下的spriteFrame修改为传入的spriteFrame
     * @param {string} node 需要更改spriteFrame的节点名称
     * @param {cc.SpriteFrame} spriteFrame 更改后的spriteFrame
     */
    replaceSpriteFrame(node, spriteFrame) {
        let scene = cc.director.getScene();
        let sceneCanvas = scene.getChildByName('Canvas');
        let sceneSf = null;
        if (sceneSprite.has(scene.name)) {
            sceneSf = sceneSprite.get(scene.name);
        } else {
            sceneSf = this.findComponents(sceneCanvas, cc.Sprite);
            sceneSprite.set(scene.name, sceneSf);
        }
        if(sceneSf){
            sceneSf.forEach((item)=>{
                if(item.node.name===node){
                    item.spriteFrame=spriteFrame;
                }
            });
        }
    },
    /**
     * @description: 查找该节点内所有指定类型的组件
     * @param {cc.Node} node 传入需要查找的节点
     * @param {cc} type 传入需要查找的类型,如cc.Sprite
     * @return: 返回该节点目录下内所有的指定类型的组件
     */
    findComponents(node, type) {
        if (!node && !type) {
            return;
        }
        let components = [];//存放所有组件
        findAllComponents(node, type);
        return components;

        function findAllComponents(node, type) {
            components = components.concat(node.getComponents(type));
            if (node.children.length > 0) {
                node.children.forEach((item) => {
                    findAllComponents(item, type);
                });
            }
        }
    },
主要是需要查找到所有需要修改的节点,也可以通过查找节点名称的方法去实现,但我一次查询出了节点下所有拥有该类型的组件并缓存起来,下次需要修改其他的节点的时候就会快速很多,当然首次执行的工作量也会比较大。

自己修改下查询的组件类型,可以查询出该节点下的不同组件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值