本文主要是介绍Creator实战项目【保卫萝卜】-- 怪物的生成、根据格子地图中的拐点来设置怪物的初始位置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在编辑器中新建怪物,把怪物做成预制体。
在怪物层中创建怪物
import ScriptBase from './ScriptBase'
import Monster from './Monster'const {ccclass, property} = cc._decorator;@ccclass
export default class MonsterLayer extends ScriptBase {@property(cc.Prefab)monsterPrefab:cc.Prefab = null;//定义数组用于存储怪物脚本(因为脚本拿节点比较容易)private arrMonsterTs:Monster[] = [];onInit(){//创建怪物//定时创建this.schedule(()=>{//1、创建let monsterN = cc.instantiate(this.monsterPrefab);//2、设置位置:到怪物脚本去设置,因为每只怪物都需要存储拐点坐标。//3、挂载monsterN.parent = this.node;//怪物脚本let monsterJs:Monster = monsterN.getComponent('Monster');//存起来this.arrMonsterTs.push(monsterJs);},1.0);}
}
因为怪物的位置是设置在TiledMap里面的,每只怪物都有初始坐标和拐点坐标,所以要到怪物脚本去设置。
在TiledMapCtrl中写一个接口getAllPos,通过格子地图拿到所有拐点。
//获取拐点对象层所有拐点坐标
getAllPos(){//定义数组(用于存所有的拐点)let arrPos:cc.Vec2[] = [];//获取对象层let objectGroup:cc.TiledObjectGroup = this.tiledMap.getObjectGroup('pathObject');//获取所有对象let arrObj = objectGroup.getObjects();//遍历对象for(let i = 0;i < arrObj.length;i++){//获取x,ylet x:number = arrObj[i]['x'];let y:number = arrObj[i]['y'];//构造一个坐标点let pos:cc.Vec2 = cc.v2(x,y);//转换成格子坐标,再转换像素(保证在格子中心点)let tiledPos:cc.Vec2 = this.getTiledByPos(pos);let pixelPos:cc.Vec2 = this.getPosByTiled(tiledPos);//存入数组arrPos.push(pixelPos);}//返回数组return arrPos;
}
在怪物脚本中,拿到格子地图里的怪物拐点,设置怪物位置为第0个拐点的位置。
因为拐点有多个,所以要定义一个拐点数组来接收,同时通过拐点索引来初始化位置。
import ConfigMgr from './ConfigMgr' //用于获取地图节点
import TiledMapCtrl from './TiledMapCtrl'const {ccclass, property} = cc._decorator;@ccclass
export default class Monster extends cc.Component {//拐点数组private arrPos:cc.Vec2[] = [];//数组索引private index:number = 0;onInit(){//获取地图let tiledMapCtrl:TiledMapCtrl = ConfigMgr.getInstance().getData('TiledMap') as TiledMapCtrl;//调用地图的接口,获取怪物的所有拐点this.arrPos = tiledMapCtrl.getAllPos();//设置初始位置为第0个let birthPos = this.arrPos[this.index];this.node.setPosition(birthPos);}
}
记得在怪物层脚本的onInit()中调用执行怪物脚本的onInit()。
onInit(){//创建怪物//定时创建this.schedule(()=>{//1、创建let monsterN = cc.instantiate(this.monsterPrefab);//2、设置位置:到怪物脚本去设置,因为每只怪物都需要存储拐点坐标。//3、挂载monsterN.parent = this.node;//获取怪物脚本let monsterJs:Monster = monsterN.getComponent('Monster');//执行怪物脚本的onInit(注意!!!!)monsterJs.onInit();//存起来this.arrMonsterTs.push(monsterJs);},1.0);
}
还存在一个小bug,由于资源问题,引擎会根据id来进行排序,造成初始化的点不是第一个拐点。
解决方法:自己写代码让拐点根据名字进行排序。
//获取拐点对象层所有拐点坐标
getAllPos(){//定义数组(用于存所有的拐点)let arrPos:cc.Vec2[] = [];//获取对象层let objectGroup:cc.TiledObjectGroup = this.tiledMap.getObjectGroup('pathObject');//获取所有对象let arrObj = objectGroup.getObjects();//拿到所有对象后,根据名字进行排序arrObj.sort((a,b)=>{return a.name-b.name;})//后续操作同上
}
这篇关于Creator实战项目【保卫萝卜】-- 怪物的生成、根据格子地图中的拐点来设置怪物的初始位置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!