通过资源方式加载预制体、精灵、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;
}
}
武器层和卡片层同上。