在编辑器中新建怪物,把怪物做成预制体。
在怪物层中创建怪物
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.sterPrefab);//2、设置位置:到怪物脚本去设置,因为每只怪物都需要存储拐点坐标。//3、挂载monsterN.parent = de;//怪物脚本let monsterJs:Monster = Component('Monster');//存起来this.arrMonsterTs.push(monsterJs);},1.0);}
}
因为怪物的位置是设置在TiledMap里面的,每只怪物都有初始坐标和拐点坐标,所以要到怪物脚本去设置。
在TiledMapCtrl中写一个接口getAllPos,通过格子地图拿到所有拐点。
//获取拐点对象层所有拐点坐标
getAllPos(){//定义数组(用于存所有的拐点)let arrPos:cc.Vec2[] = [];//获取对象层let objectGroup:cc.TiledObjectGroup = ObjectGroup('pathObject');//获取所有对象let arrObj = Objects();//遍历对象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 = TiledByPos(pos);let pixelPos:cc.Vec2 = PosByTiled(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 = Instance().getData('TiledMap') as TiledMapCtrl;//调用地图的接口,获取怪物的所有拐点this.arrPos = AllPos();//设置初始位置为第0个let birthPos = this.arrPos[this.index];de.setPosition(birthPos);}
}
记得在怪物层脚本的onInit()中调用执行怪物脚本的onInit()。
onInit(){//创建怪物//定时创建this.schedule(()=>{//1、创建let monsterN = cc.sterPrefab);//2、设置位置:到怪物脚本去设置,因为每只怪物都需要存储拐点坐标。//3、挂载monsterN.parent = de;//获取怪物脚本let monsterJs:Monster = Component('Monster');//执行怪物脚本的onInit(注意!!!!Init();//存起来this.arrMonsterTs.push(monsterJs);},1.0);
}
还存在一个小bug,由于资源问题,引擎会根据id来进行排序,造成初始化的点不是第一个拐点。
解决方法:自己写代码让拐点根据名字进行排序。
//获取拐点对象层所有拐点坐标
getAllPos(){//定义数组(用于存所有的拐点)let arrPos:cc.Vec2[] = [];//获取对象层let objectGroup:cc.TiledObjectGroup = ObjectGroup('pathObject');//获取所有对象let arrObj = Objects();//拿到所有对象后,根据名字进行排序arrObj.sort((a,b)=>{return a.name-b.name;})//后续操作同上
}
本文发布于:2024-01-29 07:19:24,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170648396913630.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |