2023-10-23 18:56:01 +08:00
|
|
|
import { _decorator } from "cc";
|
|
|
|
import GBaseMode from "../GBaseMode";
|
|
|
|
import { GTactical } from "../entity/GTactical";
|
|
|
|
import { Prefab } from "cc";
|
|
|
|
import { instantiate } from "cc";
|
|
|
|
import { Vec2 } from "cc";
|
2023-10-24 02:32:06 +08:00
|
|
|
import GRolePVPEntity from "../base/role/PVP/GRolePVPEntity";
|
2023-10-23 18:56:01 +08:00
|
|
|
const { ccclass, property } = _decorator;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//PVP 角色
|
|
|
|
export enum GPVPModePlayerEnum{
|
|
|
|
PLAYER, //玩家
|
|
|
|
ENEMY, //敌人
|
|
|
|
}
|
|
|
|
|
|
|
|
//PVP 玩家信息
|
|
|
|
export interface GPVPModePlayerInfo{
|
|
|
|
//阵法
|
|
|
|
tactical: GTactical;
|
|
|
|
//宠物列表
|
|
|
|
roles: any[];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* PVP 模式
|
|
|
|
*/
|
|
|
|
@ccclass('GPVPMode')
|
|
|
|
export default class GPVPMode extends GBaseMode{
|
|
|
|
|
|
|
|
@property(Prefab)
|
|
|
|
rolePrefab: Prefab = null;
|
|
|
|
|
|
|
|
//玩家信息
|
|
|
|
playerInfo: GPVPModePlayerInfo = { tactical: GTactical.getTactical1(),roles: [{},{},{}] };
|
|
|
|
//敌方信息
|
|
|
|
enemyInfo: GPVPModePlayerInfo = { tactical: GTactical.getTactical2(true),roles: [{},{},{}] };
|
|
|
|
|
|
|
|
//玩家宠物
|
2023-10-24 02:32:06 +08:00
|
|
|
playerRoles: GRolePVPEntity[] = [];
|
2023-10-23 18:56:01 +08:00
|
|
|
//敌方宠物
|
2023-10-24 02:32:06 +08:00
|
|
|
enemyRoles: GRolePVPEntity[] = [];
|
2023-10-23 18:56:01 +08:00
|
|
|
|
|
|
|
//玩家位置
|
|
|
|
playerPos: Vec2 = new Vec2(-400,0);
|
|
|
|
//敌方位置
|
|
|
|
enemyPos: Vec2 = new Vec2(400,0);
|
|
|
|
|
|
|
|
|
|
|
|
onSyncInitSuccess(): void {
|
|
|
|
|
|
|
|
//初始化战斗
|
|
|
|
console.log("GPVPMode 模式初始化");
|
|
|
|
|
|
|
|
//生成玩家
|
|
|
|
this.playerInfo.roles.forEach((info,index) => this.onGenRole(GPVPModePlayerEnum.PLAYER,index+1))
|
|
|
|
this.enemyInfo.roles.forEach((info,index) => this.onGenRole(GPVPModePlayerEnum.ENEMY,index+1))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//生成角色
|
|
|
|
onGenRole(type: GPVPModePlayerEnum,index:number) {
|
|
|
|
|
|
|
|
let pos:Vec2 = this.getInfo(type).tactical.getPosition(index);
|
|
|
|
if(!pos) return;
|
|
|
|
let role = instantiate(this.rolePrefab);
|
2023-10-24 02:32:06 +08:00
|
|
|
let entity = role.getComponent(GRolePVPEntity)
|
|
|
|
//赋值阵容
|
|
|
|
entity.ones = type;
|
|
|
|
entity.tactical = this.getInfo(type).tactical;
|
|
|
|
entity.tacticalIndex = index;
|
2023-10-25 02:31:51 +08:00
|
|
|
entity.tacticalPos = this.getInfo(type).tactical.getPosition(index,this.getTacticalPos(type));
|
|
|
|
this.addGObject(entity,entity.tacticalPos);
|
2023-10-24 02:32:06 +08:00
|
|
|
this.getOnesRole(type).push(entity);
|
2023-10-23 18:56:01 +08:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//获取配置
|
|
|
|
getInfo(type: GPVPModePlayerEnum): GPVPModePlayerInfo {
|
|
|
|
if(type == GPVPModePlayerEnum.PLAYER) return this.playerInfo;
|
|
|
|
if(type == GPVPModePlayerEnum.ENEMY) return this.enemyInfo;
|
|
|
|
}
|
|
|
|
|
|
|
|
//获取位置
|
|
|
|
getTacticalPos(type: GPVPModePlayerEnum):Vec2{
|
|
|
|
if(type == GPVPModePlayerEnum.PLAYER) return this.playerPos;
|
|
|
|
if(type == GPVPModePlayerEnum.ENEMY) return this.enemyPos;
|
|
|
|
}
|
2023-10-24 02:32:06 +08:00
|
|
|
|
|
|
|
//获取阵营角色
|
|
|
|
getOnesRole(type: GPVPModePlayerEnum):GRolePVPEntity[]{
|
|
|
|
if(type == GPVPModePlayerEnum.PLAYER) return this.playerRoles;
|
|
|
|
if(type == GPVPModePlayerEnum.ENEMY) return this.enemyRoles;
|
|
|
|
}
|
|
|
|
|
|
|
|
//获取敌人
|
|
|
|
getEnumy(player:GRolePVPEntity):GRolePVPEntity{
|
|
|
|
|
|
|
|
let enumyOnes = GPVPModePlayerEnum.ENEMY
|
|
|
|
//如果是ENEMY 则 它的敌人是 PLAYER
|
|
|
|
if(player.ones == GPVPModePlayerEnum.ENEMY) enumyOnes = GPVPModePlayerEnum.PLAYER
|
|
|
|
|
|
|
|
//获取敌人
|
|
|
|
let roles = this.getOnesRole(enumyOnes);
|
|
|
|
|
|
|
|
//返回敌人
|
|
|
|
//获取我在第几排
|
|
|
|
let playerXY = player.tactical.getXY(player.tacticalIndex);
|
|
|
|
//通过排数获取最近的敌人
|
|
|
|
let sort = roles.sort((enumy1,enumy2) => {
|
|
|
|
let enumy1XY = enumy1.tactical.getXY(enumy1.tacticalIndex);
|
|
|
|
let enumy2XY = enumy2.tactical.getXY(enumy2.tacticalIndex);
|
|
|
|
return Math.abs((playerXY.y * 1000) - (enumy1XY.y * 1000)) + Math.abs((playerXY.x - enumy1XY.x)) -
|
|
|
|
Math.abs((playerXY.y * 1000) - (enumy2XY.y * 1000)) + Math.abs((playerXY.x - enumy2XY.x))
|
|
|
|
});
|
|
|
|
return sort[0]
|
|
|
|
|
2023-10-25 19:19:52 +08:00
|
|
|
}
|
2023-10-24 02:32:06 +08:00
|
|
|
|
2023-10-25 19:19:52 +08:00
|
|
|
//销毁角色数据
|
|
|
|
killRole(role:GRolePVPEntity){
|
|
|
|
this.playerRoles.splice(this.playerRoles.indexOf(role),1);
|
|
|
|
this.enemyRoles.splice(this.enemyRoles.indexOf(role),1);
|
2023-10-24 02:32:06 +08:00
|
|
|
}
|
2023-10-23 18:56:01 +08:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|