123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- import { _decorator, Rect, Size, Sprite, TiledMap, TiledObjectGroup, Vec2, Vec3 } from 'cc';
- import { ModulerBase } from './ModulerBase';
- import { ObstacleMgr } from './ObstacleMgr';
- import { gameResMgr } from '../GameResMgr';
- import { TowerMgr } from './TowerMgr';
- import { TowerData } from '../../DataItem/ItemData';
- import { dataMgr } from '../../Frames/DataManager';
- const { ccclass, property } = _decorator;
- @ccclass('MapMgr')
- export class MapMgr extends ModulerBase {
- private _tiledMap:TiledMap = null;
- private _tiledSize: Size = null;
- private _pathPoints: Vec3[] = [];
- private _style: number = 1;
- private _mapBg: Sprite = null;
- private _pathBg: Sprite = null;
- tiledObjectGroup: TiledObjectGroup = null;
- //存储可种植的炮台区域
- private _canTowerRect: Rect[] = [];
- protected onLoad(): void {
- this._tiledMap = this.getComponent(TiledMap);
- const bg = this.node.parent.getChildByName("Bg");
- this._mapBg = bg.getComponent(Sprite);
- this._pathBg = bg.getChildByName("PathBg").getComponent(Sprite);
- // this.tiledObjectGroup = this.getComponentInChildren(TiledObjectGroup);
- // this.tiledObjectGroup.getObjects();
- }
- start() {
- //给TiledMap设置瓦片地图资源
- const tmx = gameResMgr.getTmx();
- this._tiledMap.tmxAsset = tmx;
- this._style = Number(this._tiledMap.getProperty("style"));
- this._tiledSize = this._tiledMap.getTileSize();
- //设置关卡背景图 和 路径背景图
- this._mapBg.spriteFrame = gameResMgr.getMapBg(this._style);
- this._pathBg.spriteFrame = gameResMgr.getPathBg();
- this._parseMap();
- }
- test(){
-
- }
- update(deltaTime: number) {
-
- }
- private _parseMap(){
- //获取瓦片地图的对象
- const objects = this._tiledMap.getObjectGroup("PATH").getObjects();
- //遍历所有对象 解析地图中的信息
- for (const obj of objects) {
- if(obj.name.includes("PT")){
- //截取字符串的第二个(0,1,2,3)=>字符"PT"后面的第一个
- const i = obj.name.slice(2);
- this._pathPoints[Number(i) - 1] = new Vec3(
- obj.x + this._tiledSize.width/2,
- obj.y - this._tiledSize.height/2)
- }
- else if(obj.name.includes("Obj")){
- //空地
- const {x, y, width, height} = obj;
- this._canTowerRect.push(new Rect(x, y - height, width, height));
- }
- else if(obj.name.includes("Ob")){
- //障碍物 位置,哪个障碍物
- //获取O字母前面的数字
- const index: string = obj.name.slice(0, obj.name.indexOf("O"));
- this.getModuler(ObstacleMgr).creatorObs(
- this.getCenterByObj(obj),
- this._style,
- Number(index));
- //记录一下 占了哪个范围 后续障碍被拆除 就是可以种炮台的格子
- }
- else if(obj.name.includes("T")){
- //赠送的炮台
- const id: string = obj.name.slice(0, obj.name.indexOf("T"));
- //通过id创建炮台位置
- const pos = this.getCenterByObj(obj);
- //通过id创建炮台
- const data: TowerData = dataMgr.getData(Number(id), "TowerDt")
- this.getModuler(TowerMgr).creatTower(pos, data);
- }
- }
- }
-
- getCenterByObj(obj): Vec3{
- return new Vec3(obj.x + obj.width / 2,
- obj.y - obj.height / 2
- )
- }
- getCenterByPos(pos: Vec2): Vec3{
- //计算点击到了第几行 第几列格子
- return this.getPosByTiled(this.getTiledByPos(pos));
- }
- getPosByTiled(tiled: Vec2): Vec3{
- const x = (tiled.x + 0.5) * this._tiledSize.width;
- const y = (tiled.y + 0.5) * this._tiledSize.height;
- return new Vec3(x,y);
- }
- //获取某个坐标在地图的第几行 第几列的格子
- getTiledByPos(pos: Vec2): Vec2{
- const x = Math.floor(pos.x / this._tiledSize.width);
- const y = Math.floor(pos.y / this._tiledSize.height);
- return new Vec2(x,y);
- }
- getPath(): Vec3[]{
- return this._pathPoints;
- }
- //判断点击坐标是否可种植炮台
- canCreatorTower(pos: Vec2): Vec3{
- for(const rect of this._canTowerRect){
- if(rect.contains(pos)){
- return this.getCenterByPos(pos);
- }
- }
- return null;
- }
- // getPath(): Vec3[]{
- // const objects = this._tiledMap.getObjectGroup("PATH").getObjects();
- // const points: Vec3[] = [];
- // for (const obj of objects) {
- // if(obj.name.startsWith("PT")){
- // //截取字符串的第二个(0,1,2,3)=>字符"PT"后面的第一个
- // const i = obj.name.slice(2);
- // points[Number(i) - 1] = new Vec3(
- // obj.x + this._tiledSize.width/2,
- // obj.y - this._tiledSize.height/2)
- // }
- // }
- // return points;
- // }
- }
|