|
@@ -1,20 +1,29 @@
|
|
|
-import { _decorator, easing, MeshRenderer, Node, tween, Vec3 } from 'cc';
|
|
|
+import { _decorator, easing, MeshRenderer, Node, rect, tween, Vec3 } from 'cc';
|
|
|
import { BaseExp } from '../core/base/BaseExp';
|
|
|
import { autoBind } from '../extend/AutoBind';
|
|
|
import { Utils } from '../utils/Utils';
|
|
|
const { ccclass, property } = _decorator;
|
|
|
|
|
|
+//坐标类
|
|
|
+export class MPos{
|
|
|
+ //位置坐标
|
|
|
+ public pos: Vec3 = Vec3.ZERO;
|
|
|
+ //该站立点是否已经有人在此站位了
|
|
|
+ public isVacancy: boolean = false;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
//埋伏点接口类
|
|
|
export class AmbushPoint {
|
|
|
//埋伏点位置节点数组
|
|
|
- public standPosArr: Vec3[] = [];
|
|
|
+ public standPosArr: MPos[] = [];
|
|
|
//中间路径节点
|
|
|
- public roadPosArr: Vec3[] = [];
|
|
|
+ public roadPosArr: MPos[] = [];
|
|
|
//掩体点位置节点
|
|
|
- public ambushPosArr: Vec3[] = [];
|
|
|
+ public ambushPosArr: MPos[] = [];
|
|
|
//逃跑点位置节点
|
|
|
- public escapePosArr: Vec3[] = [];
|
|
|
- //是否已经有人在此站位了
|
|
|
+ public escapePosArr: MPos[] = [];
|
|
|
+ //改大的堆点是否已经遍历过
|
|
|
public isVacancy: boolean = false;
|
|
|
}
|
|
|
|
|
@@ -96,27 +105,49 @@ export class GMap extends BaseExp {
|
|
|
.map(ambushNode => {
|
|
|
const point = new AmbushPoint();
|
|
|
point.isVacancy = false;
|
|
|
- //从节点结构获取坐标配置
|
|
|
+ //转换为MPos类
|
|
|
point.standPosArr = ambushNode.children
|
|
|
.filter(e => e.name.startsWith('stand_'))
|
|
|
- .map(node => node.worldPosition.clone());
|
|
|
+ .map(node => {
|
|
|
+ let mpos = new MPos();
|
|
|
+ mpos.pos = node.worldPosition.clone();
|
|
|
+ mpos.isVacancy = false;
|
|
|
+ return mpos;
|
|
|
+ });
|
|
|
point.roadPosArr = ambushNode.children
|
|
|
.filter(e => e.name.startsWith('road_'))
|
|
|
.sort((a, b) => {
|
|
|
- //提取数字部分(兼容 road_1 / road_01 / road_001 等所有情况)
|
|
|
const getNumber = (name: string) => {
|
|
|
- const numPart = name.split('_').pop(); // 取最后一段
|
|
|
- return parseInt(numPart || '0', 10); // 自动忽略前导零
|
|
|
+ const numPart = name.split('_').pop();
|
|
|
+ return parseInt(numPart || '0', 10);
|
|
|
};
|
|
|
- return getNumber(a.name) - getNumber(b.name); // 按数值升序
|
|
|
+ return getNumber(a.name) - getNumber(b.name);
|
|
|
})
|
|
|
- .map(node => node.worldPosition.clone());
|
|
|
+ .map(node => {
|
|
|
+ let mpos = new MPos();
|
|
|
+ mpos.pos = node.worldPosition.clone();
|
|
|
+ mpos.isVacancy = false;
|
|
|
+ return mpos;
|
|
|
+ });
|
|
|
+
|
|
|
point.ambushPosArr = ambushNode.children
|
|
|
- .filter(e => e.name.startsWith('bunker_'))
|
|
|
- .map(node => node.worldPosition.clone());
|
|
|
+ .filter(e => e.name.startsWith('bunker_'))
|
|
|
+ .map(node => {
|
|
|
+ let mpos = new MPos();
|
|
|
+ mpos.pos = node.worldPosition.clone();
|
|
|
+ mpos.isVacancy = false;
|
|
|
+ return mpos;
|
|
|
+ });
|
|
|
+
|
|
|
point.escapePosArr = ambushNode.children
|
|
|
- .filter(e => e.name.startsWith('escape_'))
|
|
|
- .map(node => node.worldPosition.clone());
|
|
|
+ .filter(e => e.name.startsWith('escape_'))
|
|
|
+ .map(node => {
|
|
|
+ let mpos = new MPos();
|
|
|
+ mpos.pos = node.worldPosition.clone();
|
|
|
+ mpos.isVacancy = false;
|
|
|
+ return mpos;
|
|
|
+ });
|
|
|
+
|
|
|
return point;
|
|
|
});
|
|
|
}
|
|
@@ -140,11 +171,9 @@ export class GMap extends BaseExp {
|
|
|
ambush.isVacancy = true;
|
|
|
eData.ambush = ambush;
|
|
|
//查找中间路径点
|
|
|
- paths = paths.concat(ambush.roadPosArr);
|
|
|
+ paths = paths.concat(ambush.roadPosArr.map(mpos => mpos.pos));
|
|
|
//随机一个站立点到最后坐标
|
|
|
- const endPos:Vec3 = Utils.randomArray(ambush.standPosArr)[0];
|
|
|
- endPos.x += Utils.getRandomFloat(0,0.35);
|
|
|
- paths.push(endPos);
|
|
|
+ paths.push(this.getStandPos(ambush.standPosArr));
|
|
|
//测试时使用
|
|
|
/*paths.forEach(e => {
|
|
|
console.log("FFFFFF = " + this.node.getComponent(UITransform).convertToNodeSpaceAR(e));
|
|
@@ -153,7 +182,27 @@ export class GMap extends BaseExp {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 得到一个站位点
|
|
|
+ * 得到一个敌人的站位点
|
|
|
+ */
|
|
|
+ private getStandPos(standPosArr: MPos[]): Vec3 {
|
|
|
+ if(standPosArr.length <= 0){
|
|
|
+ return Vec3.ZERO;
|
|
|
+ }else{
|
|
|
+ //获取所有可用的站位点(未被占用的)
|
|
|
+ const availablePoints = standPosArr.filter(p => !p.isVacancy);
|
|
|
+ //随机返回一个可用站位点 当所有点位都被占用时,随机返回任意一个
|
|
|
+ let isAddRandom: boolean = availablePoints.length <= 0;
|
|
|
+ let points: MPos[] = availablePoints.length > 0 ? availablePoints : standPosArr;
|
|
|
+ let pos: Vec3 = Utils.randomArray(points)[0].pos;
|
|
|
+ if(isAddRandom){
|
|
|
+ pos.x += Utils.getRandomFloat(-0.3,0.3);
|
|
|
+ }
|
|
|
+ return pos;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 得到一个堆点类
|
|
|
*/
|
|
|
private getAmbushClas(){
|
|
|
if(!this.ambushPoints
|
|
@@ -163,15 +212,9 @@ export class GMap extends BaseExp {
|
|
|
}
|
|
|
//获取所有可用的埋伏点(未被占用的)
|
|
|
const availablePoints = this.ambushPoints.filter(p => !p.isVacancy);
|
|
|
- if (availablePoints.length > 0) {
|
|
|
- //随机返回一个可用埋伏点
|
|
|
- return Utils.randomArray(availablePoints)[0];
|
|
|
- }
|
|
|
- //当所有点位都被占用时,随机返回任意一个
|
|
|
- if(this.ambushPoints.length > 0) {
|
|
|
- return Utils.randomArray(this.ambushPoints)[0];
|
|
|
- }
|
|
|
- return null;
|
|
|
+ //随机返回一个可用埋伏点 当所有点位都被占用时,随机返回任意一个
|
|
|
+ let points: AmbushPoint[] = availablePoints.length > 0 ? availablePoints : this.ambushPoints;
|
|
|
+ return Utils.randomArray(points)[0];
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -224,8 +267,12 @@ export class GMap extends BaseExp {
|
|
|
* 还原数据
|
|
|
*/
|
|
|
public resetData(){
|
|
|
- this.ambushPoints.forEach(e => {
|
|
|
+ this.ambushPoints.forEach((e: AmbushPoint) => {
|
|
|
e.isVacancy = false;
|
|
|
+ e.standPosArr.forEach((a: MPos) => a.isVacancy = false);
|
|
|
+ e.roadPosArr.forEach((b: MPos) => b.isVacancy = false);
|
|
|
+ e.ambushPosArr.forEach((c: MPos) => c.isVacancy = false);
|
|
|
+ e.escapePosArr.forEach((d: MPos) => d.isVacancy = false);
|
|
|
});
|
|
|
}
|
|
|
}
|