mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-06-26 19:34:47 +00:00
187 lines
5.5 KiB
TypeScript
187 lines
5.5 KiB
TypeScript
import { Vec2 } from "cc";
|
|
import GDefaultMode from "./default/GDefaultMode";
|
|
import { TB } from "../../config/data/schema";
|
|
import GRoleDefault from "../base/role/GRoleDefault";
|
|
import { _decorator } from "cc";
|
|
import GBaseMode from "../GBaseMode";
|
|
import { Prefab } from "cc";
|
|
import { instantiate } from "cc";
|
|
import GRoleCGCrystal from "../base/role/CampGuardian/GRoleCGCrystal";
|
|
import { TD, app } from "../../App";
|
|
import { GTowards } from "../base/GObject";
|
|
import GRoleBase from "../base/role/GRoleBase";
|
|
import { GTactical } from "../entity/GTactical";
|
|
import JNFrameTime from "../../../../extensions/ngame/assets/ngame/sync/frame/game/time/JNFrameTime";
|
|
import { TbGPetId } from "../../config/TbGPet";
|
|
import GModeTools from "./GModeTools";
|
|
import GPetAttribute from "../base/values/attribute/role/GPetAttribute";
|
|
import RandomUtil from "../../../../extensions/ngame/assets/ngame/util/RandomUtil";
|
|
import { GModeEvent } from "./GMode";
|
|
import { Camera } from "cc";
|
|
const { ccclass, property } = _decorator;
|
|
|
|
//阵营守护 角色
|
|
export enum GCampGuardianEnum{
|
|
PLAYER, //玩家
|
|
ENEMY, //敌人
|
|
}
|
|
|
|
//阵营守护
|
|
//玩家派兵攻击对方阵营 游戏参考
|
|
@ccclass('GCampGuardianMode')
|
|
export default class GCampGuardianMode extends GBaseMode<{},{}>{
|
|
|
|
//玩家水晶位置
|
|
playerPos: Vec2 = new Vec2(-800,-50);
|
|
//敌方水晶位置
|
|
enemyPos: Vec2 = new Vec2(800,-50);
|
|
|
|
//我方水晶
|
|
|
|
//敌方水晶
|
|
|
|
//水晶预制体
|
|
@property(Prefab)
|
|
crystalPrefab: Prefab;
|
|
|
|
//角色预制体
|
|
@property(Prefab)
|
|
petPrefab: Prefab;
|
|
|
|
//玩家宠物
|
|
playerRoles: GRoleBase<{}>[] = [];
|
|
//敌方宠物
|
|
enemyRoles: GRoleBase<{}>[] = [];
|
|
|
|
//模式相机
|
|
@property(Camera)
|
|
modeCamera:Camera;
|
|
|
|
onSyncInitSuccess(){
|
|
|
|
//生成水晶
|
|
this.onGenCrystal(GCampGuardianEnum.PLAYER);
|
|
this.onGenCrystal(GCampGuardianEnum.ENEMY);
|
|
|
|
//定时器生成
|
|
JNFrameTime.getInstance().setInterval(() => {
|
|
let max = TD.TbGRole.getDataList().length;
|
|
this.onGenRole(GCampGuardianEnum.PLAYER,TD.TbGRole.getDataList()[Math.floor(this.getSync().SyncRandomInt(0,max - 1))]);
|
|
this.onGenRole(GCampGuardianEnum.ENEMY,TD.TbGRole.getDataList()[Math.floor(this.getSync().SyncRandomInt(0,max - 1))]);
|
|
},2000)
|
|
|
|
}
|
|
|
|
//生成水晶
|
|
onGenCrystal(type:GCampGuardianEnum){
|
|
|
|
let crystalNode = instantiate(this.crystalPrefab);
|
|
let crystal = crystalNode.getComponent(GRoleCGCrystal);
|
|
crystal.init(TD.TbGRole.get(TbGPetId.雷吉艾斯));
|
|
|
|
switch(type){
|
|
case GCampGuardianEnum.PLAYER:
|
|
this.addGObject(crystal,this.playerPos)
|
|
break;
|
|
case GCampGuardianEnum.ENEMY:
|
|
crystal.setTowards(GTowards.LEFT)
|
|
this.addGObject(crystal,this.enemyPos)
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
//生成宠物
|
|
onGenRole(type:GCampGuardianEnum,info:TB.TbGRole):GRoleDefault {
|
|
|
|
let tactical = GTactical.getTactical();
|
|
let pos:Vec2;
|
|
|
|
switch(type){
|
|
case GCampGuardianEnum.PLAYER:
|
|
tactical.setOffset(this.playerPos);
|
|
pos = tactical.getPosXYPosition(1,1,this.playerPos);
|
|
break;
|
|
case GCampGuardianEnum.ENEMY:
|
|
tactical.setOffset(this.enemyPos);
|
|
pos = tactical.getPosXYPosition(1,1,this.enemyPos);
|
|
break;
|
|
}
|
|
|
|
|
|
if(!pos) return;
|
|
let role = instantiate(this.petPrefab);
|
|
|
|
let entity = role.getComponent(GRoleDefault);
|
|
//初始化
|
|
entity.onInit(type,info,tactical,tactical.getPosXY(1,1));
|
|
|
|
//绑定寻敌
|
|
entity.onQueryEunmy = () => {
|
|
return GModeTools.getNearbyEnumy(entity,this.getOnesRoleAlive(type == GCampGuardianEnum.PLAYER ? GCampGuardianEnum.ENEMY : GCampGuardianEnum.PLAYER));
|
|
}
|
|
|
|
//绑定死亡回调
|
|
entity.addKillBackEvent(this.onRoleKillBack.bind(this))
|
|
|
|
//添加宠物属性
|
|
entity.onEffectiveValue(new GPetAttribute({
|
|
petId:info.id,
|
|
petPlayerId:0,
|
|
petTbId:info.id,
|
|
petLevel:0,
|
|
petStar:0,
|
|
petStarExp:0,
|
|
}));
|
|
//绑定受击回调
|
|
entity.addHitCallback(this.onHitBack.bind(this));
|
|
|
|
this.addGObject(entity,pos);
|
|
this.getOnesRole(type).push(entity);
|
|
return entity;
|
|
|
|
}
|
|
|
|
//获取阵营宠物
|
|
getOnesRole(type: GCampGuardianEnum):GRoleBase<{}>[]{
|
|
if(type == GCampGuardianEnum.PLAYER) return this.playerRoles;
|
|
if(type == GCampGuardianEnum.ENEMY) return this.enemyRoles;
|
|
}
|
|
|
|
//获取存活的宠物
|
|
getOnesRoleAlive(type: GCampGuardianEnum):GRoleBase<{}>[]{
|
|
if(type == GCampGuardianEnum.PLAYER) return this.playerRoles.filter(role => !!role.get());
|
|
if(type == GCampGuardianEnum.ENEMY) return this.enemyRoles.filter(role => !!role.get());
|
|
}
|
|
|
|
//角色死亡回调
|
|
onRoleKillBack(role:GRoleDefault){
|
|
|
|
//死亡销毁
|
|
JNFrameTime.getInstance().setTimeout(() => {
|
|
if(role.isValid)
|
|
role.node.destroy()
|
|
},3000)
|
|
|
|
}
|
|
|
|
//角色受击回调
|
|
onHitBack(role:GRoleDefault,hit:number){
|
|
|
|
if(!role.get()) return;
|
|
|
|
//添加受击显示
|
|
app.event.emit(GModeEvent.HIT,{
|
|
mode:this,
|
|
role:role,
|
|
hit:hit,
|
|
world:role.v2World,
|
|
camera:this.modeCamera,
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|