Creator实战项目【保卫萝卜】-- 资源加载(进度条)与资源管理

新建一个recourse文件夹,把需要加载的资源放入。
在这里插入图片描述
创建Loading脚本,使用 cc.resources.loadDir( ) 加载资源
cc.resources 是一个 bundle,用于管理所有在 assets/resources 下的资源

const {ccclass, property} = cc._decorator;

@ccclass
export default class NewClass extends cc.Component {

    start () {
		//进度回调函数
        let onProgress =(finish:number,total:number,item)=>{
        	console.log(finish,total);
        }   
        //完成回调函数
        let onComplete =(err:Error,assets: cc.Asset[])=>{
            if(err){
                console.log('err');
                return;
            }
           	console.log(assets);
        }

        //读取所有资源
        //参数一:以resources为根目录的文件夹路径
        //参数二:要加载的资源的类型
        //参数三:进度回调函数
        //参数三:完成回调函数,加载完的资源,存储到回调的参数里面。
        cc.resources.loadDir('',null,onProgress,onComplete);
    }
}

在这里插入图片描述
在菜单场景创建一个进度条节点,挂载Loading脚本
在这里插入图片描述
当进度条走完(资源加载完)后,才显示菜单。
把过后才要显示的内容放入NormalLayer中,先设置为隐藏,然后在Loading代码中显示出来。
在这里插入图片描述

const {ccclass, property} = cc._decorator;

@ccclass
export default class NewClass extends cc.Component {

    start () {
		//进度回调函数
        let onProgress =(finish:number,total:number,item)=>{
			//计算加载进度
            let progress = finish/total;
            //修改进度条进度
            let progressBar = this.node.getChildByName('progressBar').getComponent(cc.ProgressBar);
            progressBar.progress = progress;
        }   
        //完成回调函数    cc.Asset[]是一个资源数组
        let onComplete =(err:Error,assets: cc.Asset[])=>{
            if(err){
                console.log('err');
                return;
            }
            //显示菜单
            cc.find('Canvas/NormalLayer').active = true;
        }

        //读取所有资源
        //参数一:以resources为根目录的文件夹路径
        //参数二:要加载的资源的类型
        //参数三:进度回调函数
        //参数三:完成回调函数,加载完的资源,存储到回调的参数里面。
        cc.resources.loadDir('',null,onProgress,onComplete);
    }
}

创建一个资源基类ResBase脚本
基类用于创建不同类型的资源对象,并调用addData函数从Asset中加载出不同类型的资源。

interface ResDt{
    resName:string,    //资源名字
    resType:cc.Asset    //资源
}

export default class ResBase{
    private arrData:ResDt[] = [];   //存储资源的数组
    constructor() {
        
    }

    //用于根据不同的类型加载Asset资源
    addData(name:string,resData:cc.Asset):void{
        //创建一个Data类型的对象,把它压入到数组
        //根据接口类型创建出对象的属性。
        let configData:ResDt ={
            resName:name,
            resType:resData
        };
        this.arrData.push(configData);
    }


    //通过名字获取资源(共有的方法)
    getDataByName(name:string):cc.Asset{
        //遍历数组,拿到每个元素(对象)里面的configName属性是否跟传递进来的name一样,如果一样返回 脚本
        for(let value of this.arrData){
            if(name === value.resName){
                return value.resType;
            }
        }
        return null;
    }


    //通过id获取json数据
    getJsonByID(jsonName:string,id:number,isJson:boolean = false){
        //如果不是json返回空
        if(!isJson||jsonName.length === 0){
            return null;
        }
        //首先根据名字拿到json
        let jsonAsset =this.getDataByName(jsonName) as cc.JsonAsset;
        //获取json数据数组
        let arrJson = jsonAsset.json;
        //循环根据ID查找具体数据
        for(let value of arrJson){
            if(id === value.id){
                return value;
            }
        }
        return null;
    }
}

创建一个统一管理不同资源的ResMgr,把它设为单例。

import ResBase from './ResBase'

interface MgrData{
    resMgrName:string,   
    resMgrType:ResBase   
}

export default class ResMgr{
    private static instance = null;
    private arrMgr:MgrData[] = [];

    //结构体
    constructor() {
        
    }

    //单例
    public static getInstance(){
        if(!ResMgr.instance){
            ResMgr.instance = new ResMgr();
        }

        return ResMgr.instance;
    }


    //把不同的Asset存进来
    addData(name:string,resMgr:ResBase):void{
        //创建一个Data类型的对象,把它压入到数组
        //根据接口类型创建出对象的属性。
        let configData:MgrData ={
            resMgrName:name,
            resMgrType:resMgr
        };
        this.arrMgr.push(configData);
    }


    //获取不同的Asset
    getData(name:string):ResBase{
        //遍历数组,拿到每个元素(对象)里面的configName属性是否跟传递进来的name一样,如果一样返回 脚本
        for(let value of this.arrMgr){
            if(name === value.resMgrName){
                return value.resMgrType;
            }
        }
        //循环结束如果没有找到返回null
        return null;
    }
}

在Loading中,资源加载进来以后,有各种类型的资源。
地图资源相应地要存到地图里,所以要判断资源的类型进行存储。
先new一个基类类型的地图资源tiledMapAsset,然后调用基类类型的资源加载接口addData把资源加载到tiledMapAsset中,最后调用资源管理者ResMgr的接口addData把地图资源tiledMapAsset添加到ResMgr中进行统一管理。

import ResMgr from './ResMgr'
import MgrBase from './ResBase'

const {ccclass, property} = cc._decorator;

@ccclass
export default class NewClass extends cc.Component {

    start () {
        //进度回调函数
        let onProgress =(finish:number,total:number,item)=>{
            
			//计算加载进度
            let progress = finish/total;
            let progressBar = this.node.getChildByName('progressBar').getComponent(cc.ProgressBar);
            progressBar.progress = progress;
        }   

        //完成回调函数   cc.Asset[]是一个资源数组
        let onComplete =(err:Error,assets: cc.Asset[])=>{
            if(err){
                console.log('err');
                return;
            }
        
            console.log(assets);
            //显示菜单
            cc.find('Canvas/NormalLayer').active = true;


            //处理资源加载进来后的存储逻辑
           
			//遍历资源数组
            for(let value of assets){
                //获取名字
                let name:string  = value.name;
                //判断value的类型,进行存储。

                if(value instanceof cc.TiledMapAsset){   
                    //new一个基类类型的地图
                    let tiledMapAsset = new MgrBase();   
                    //调用基类类型的资源加载接口              
                    tiledMapAsset.addData(name,value);  
                    //把地图资源添加到ResMgr统一管理
                    ResMgr.getInstance().addData('TiledMapAsset',tiledMapAsset);                  
                }

                else if(value instanceof cc.Prefab){
                     //预制体
                     let prefabAsset = new MgrBase();
                     prefabAsset.addData(name,value);
                     ResMgr.getInstance().addData('PrefabAsset',prefabAsset);
                   
                }

                else if(value instanceof cc.SpriteAtlas){
                    let arrSpriteFrams = value.getSpriteFrames();
                    for(let spriteFrame of arrSpriteFrams){
                        //精灵
                        let spriteAsset = new MgrBase();
                        spriteAsset.addData(spriteFrame.name,spriteFrame);
                        ResMgr.getInstance().addData('SpriteAsset',spriteAsset);
                    }
                }

                else if(value instanceof cc.JsonAsset){
                    //json数据
                    let jsonAsset = new MgrBase();	
                    jsonAsset.addData(value.name,value);
                    ResMgr.getInstance().addData('JsonAsset',jsonAsset);
                }
            }

        }

        //读取所有资源
        //参数一:以resources为根目录的文件夹路径
        //参数二:要加载的资源的类型
        //参数三:进度回调函数
        //参数三:完成回调函数,加载完的资源,存储到回调的参数里面。
        cc.resources.loadDir('',null,onProgress,onComplete);
    }
}

在这里插入图片描述
资源的使用:
至此,地图资源已经被加载进来了,不再使用原先的公布数组方式获取地图,直接拿存入的资源即可。
在这里插入图片描述

//获取格子地图资源(拿到具体对象下的具体资源)
let tmxAsset = ResMgr.getInstance().getData('TiledMapAsset').getDataByName('map'+(window.myGlobal.mapIndex+1));

//修改地图
this.tiledMap.tmxAsset = tmxAsset;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 Cocos Creator 2.7 版本中,可以通过 `cc.loader` 模块来加载资源,并使用 `cc.ProgressBar` 组件来创建一个资源加载进度条。具体的实现步骤如下: 1. 创建一个进度条节点 在场景编辑器中创建一个节点,并添加 `cc.ProgressBar` 组件。设置进度条的样式、位置、大小等属性。 2. 加载资源时更新进度条 使用 `cc.loader` 模块加载资源时,可以使用 `onProgress` 方法监听进度,根据已经加载资源数和总资源数来计算加载进度,并将进度条的百分比设置为相应的值。 ``` // 加载资源的过程中 cc.loader.loadResDir("resources", (completedCount, totalCount, item) => { let percent = completedCount / totalCount; progressBar.progress = percent; // 设置进度条的百分比 }, (err, assets) => { // 加载完成后的回调 }); ``` 其中,`loadResDir` 方法用于加载资源目录中的所有资源,`completedCount` 表示已经加载资源数,`totalCount` 表示总资源数,`item` 表示当前加载资源信息。`percent` 表示已经加载资源数占总资源数的百分比,`progress` 是 `cc.ProgressBar` 组件的进度属性,将其设置为相应的值即可更新进度条。 3. 加载完成时隐藏进度条资源加载完成时,可以将进度条节点隐藏起来。 ``` // 资源加载完成后 progressNode.active = false; // 隐藏进度条节点 ``` 这样,你就可以在 Cocos Creator 2.7 中使用 `cc.loader` 模块和 `cc.ProgressBar` 组件来创建一个资源加载进度条了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值