Creator实战项目【保卫萝卜】-- 资源的使用(修改预制体)

通过资源方式加载预制体、精灵、json数据。

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;
            }
        
            //显示菜单
            cc.find('Canvas/NormalLayer').active = true;

            //处理资源加载进来后的存储逻辑
            //地图
            let tiledMapAssetMgr = new MgrBase();
            ResMgr.getInstance().addData('TiledMapAsset',tiledMapAssetMgr);
            //预制体
            let prefabAssetMgr = new MgrBase();
            ResMgr.getInstance().addData('PrefabAsset',prefabAssetMgr);
            //精灵
            let spriteAssetMgr = new MgrBase();
            ResMgr.getInstance().addData('SpriteAsset',spriteAssetMgr);
            //json数据
            let jsonAssetMgr = new MgrBase();
            ResMgr.getInstance().addData('JsonAsset',jsonAssetMgr);
			
			//遍历资源数组
            for(let value of assets){
                //获取名字
                let name:string  = value.name;
                //判断value的类型,进行存储。
                if(value instanceof cc.TiledMapAsset){                    
                    tiledMapAssetMgr.addData(name,value);                    
                }
                else if(value instanceof cc.Prefab){
                    prefabAssetMgr.addData(name,value);
                }
                else if(value instanceof cc.SpriteAtlas){
                    let arrSpriteFrams = value.getSpriteFrames();
                    for(let spriteFrame of arrSpriteFrams){
                        spriteAssetMgr.addData(spriteFrame.name,spriteFrame);
                    }
                }
                else if(value instanceof cc.JsonAsset){
                    jsonAssetMgr.addData(value.name,value);
                }
            }

        }

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

资源的使用
在子弹层脚本中,获取资源中的子弹预制体(修改的部分已在代码中标明)

import ScriptBase from '../Game/ScriptBase'
import Monster from './Monster';
import ResMgr from '../Res/ResMgr'      //导入ResMgr(添)

const {ccclass, property} = cc._decorator;

@ccclass
export default class BulletLayer extends ScriptBase {
	//不再使用公布的方式(删)
    // @property(cc.Prefab)
    // bulletPrefab:cc.Prefab = null;

    addBullet(pos:cc.Vec3,monsterTS:Monster){
        //发射子弹的那一刻,如果目标已经被移除,那么不发射子弹。
        if(!monsterTS.node){
            return;
        }

        //加载预制体资源(添),拿到子弹的预制体
        let bulletPrefab = ResMgr.getInstance().getData('PrefabAsset').getData('Bullet');
        //不再是this.(改)
        // bulletN = cc.instantiate(this.bulletPrefab);
        let bulletN = cc.instantiate(bulletPrefab);

        bulletN.position = pos;
        bulletN.parent = this.node;

        //设置子弹的攻击目标为传进来的敌人
        let bulletTs = bulletN.getComponent('Bullet');
        bulletTs.attackTarget = monsterTS;
    }

    //调用每个子弹的onUpdate(dt)
    onUpdate(dt){
        let children = this.node.children
        for(let value of children){
            value.getComponent('Bullet').onUpdate(dt);
        }
    }
}

在怪物层脚本中,获取怪物预制体

import ScriptBase from '../Game/ScriptBase'
import Monster from './Monster'
import ResMgr from '../Res/ResMgr'

const {ccclass, property} = cc._decorator;

@ccclass
export default class MonsterLayer extends ScriptBase {

    //定义数组用于存储怪物脚本(因为脚本拿节点比较容易)
    private arrMonsterTs:Monster[] = [];

    onInit(){
       //创建怪物
       //定时创建
       this.schedule(()=>{
        //1、创建(拿到资源)
        let monsterPrefab = ResMgr.getInstance().getData('PrefabAsset').getData('Monster');
        let monsterN = cc.instantiate(monsterPrefab);
        //2、设置位置:到怪物脚本去设置,因为每只怪物都需要存储拐点坐标。
        //3、挂载
        monsterN.parent = this.node;
    }
}

武器层和卡片层同上。

上一篇:Codeforces Round #762 (Div. 3)


下一篇:CC+VS2015编译