模式状态机

This commit is contained in:
PC-20230316NUNE\Administrator 2023-11-03 19:01:58 +08:00
parent ca5fa0cc92
commit 2eca21dab1
4 changed files with 115 additions and 11 deletions

View File

@ -17,7 +17,7 @@ export class WorldCanvas extends Component {
@property([Prefab]) @property([Prefab])
prefabs:Prefab[] = []; prefabs:Prefab[] = [];
index:number = 0; index:number = 1;
async onLoad(){ async onLoad(){

View File

@ -189,6 +189,11 @@ export default class GFSMDefault extends GFSMBase{
} }
//获取 寻找敌人状态
getSeekEnemyProcessEnum(){
return ProcessEnum.SeekEnemy;
}
} }

View File

@ -15,8 +15,16 @@ import JNFrameTime from "../../../../extensions/ngame/assets/ngame/sync/frame/ga
import { TableGMap } from "../../../resources/config/ts/TableGMap"; import { TableGMap } from "../../../resources/config/ts/TableGMap";
import { app } from "../../App"; import { app } from "../../App";
import { v3 } from "cc"; import { v3 } from "cc";
import { v2 } from "cc";
import GFSMOnHookMode from "./OnHook/GFSMOnHookMode";
const { ccclass, property } = _decorator; const { ccclass, property } = _decorator;
//挂机模式状态
export enum GOnHookModeState{
GoTarget,//前往目标
Attack, //攻击
AttackEnd, //攻击结束
}
//角色 //角色
export enum GOnHookModePlayerEnum{ export enum GOnHookModePlayerEnum{
@ -71,11 +79,23 @@ export default class GOnHookMode extends GBaseMode<{}>{
//敌方宠物 //敌方宠物
enemyRoles: GRoleDefault[] = []; enemyRoles: GRoleDefault[] = [];
offsetX:number = 0;
//地图信息 //地图信息
mapInfo:TableGMap; mapInfo:TableGMap;
//每一波怪的距离
everyX:number = 1000;
//下一波怪的对战位置X
_nextFightX:number = 0;
get nextFightX(){return this._nextFightX}
set nextFightX(value:number){
//修改玩家阵法位置
this.playerInfo.tactical.setOffset(this.playerPos.clone().add(v2(value,0)))
this._nextFightX = value;
}
fsm:GFSMOnHookMode;
onSyncInitSuccess():void{ onSyncInitSuccess():void{
//初始化战斗 //初始化战斗
@ -85,6 +105,9 @@ export default class GOnHookMode extends GBaseMode<{}>{
let camreaPos = this.camera.node.worldPosition; let camreaPos = this.camera.node.worldPosition;
this.camera.node.worldPosition = v3(0,100,camreaPos.z) this.camera.node.worldPosition = v3(0,100,camreaPos.z)
//初始化状态机
this.fsm = new GFSMOnHookMode(this);
//初始化地图 //初始化地图
this.mapInfo = TableGMap.getConfig(60001); this.mapInfo = TableGMap.getConfig(60001);
this.map1.init(app.battleRes.maps[60001][0],1); this.map1.init(app.battleRes.maps[60001][0],1);
@ -99,12 +122,38 @@ export default class GOnHookMode extends GBaseMode<{}>{
//生成玩家 //生成玩家
this.playerInfo.roles.forEach((info,index) => this.onGenRole(GOnHookModePlayerEnum.PLAYER,index + 1,info)) this.playerInfo.roles.forEach((info,index) => this.onGenRole(GOnHookModePlayerEnum.PLAYER,index + 1,info))
//生成敌人
this.onResetGenerateEnemy(); JNFrameTime.getInstance().setTimeout(() => {
//下一波怪
this.onNextTarget();
})
// //生成敌人
// this.onResetGenerateEnemy();
} }
onSyncUpdate(dt: number,frame:JNFrameInfo, input?: {}){ onSyncUpdate(dt: number,frame:JNFrameInfo, input?: {}){
super.onSyncUpdate(dt,frame,input);
this.onUpdateCamera(dt);
this.fsm.onUpdate(dt,frame);
}
//更新相机逻辑
onUpdateCamera(dt:number){
//如果没有敌人相机永远锁定最前面的宠物
if(!this.isHaveEnemy()){
//获取冲到最前面的宠物
let roles = this.getOnesRole(GOnHookModePlayerEnum.PLAYER);
let frontRole = roles.sort((role1,role2) => role2.v2World.x - role1.v2World.x)[0];
if(!frontRole) return;
//设置相机 位置
let cameraWorld = this.camera.node.worldPosition.clone();
this.camera.node.worldPosition = cameraWorld.lerp(v3(frontRole.v2World.x,cameraWorld.y,cameraWorld.z),(dt / 1000));
}
} }
@ -144,6 +193,12 @@ export default class GOnHookMode extends GBaseMode<{}>{
if(type == GOnHookModePlayerEnum.ENEMY) return this.enemyRoles; if(type == GOnHookModePlayerEnum.ENEMY) return this.enemyRoles;
} }
//获取存活的宠物
getOnesRoleAlive(type: GOnHookModePlayerEnum):GRoleDefault[]{
if(type == GOnHookModePlayerEnum.PLAYER) return this.playerRoles.filter(role => !!role.get());
if(type == GOnHookModePlayerEnum.ENEMY) return this.enemyRoles.filter(role => !!role.get());
}
//获取敌人 //获取敌人
getEnumy(player:GRoleDefault,type:GOnHookModePlayerEnum):GRoleDefault{ getEnumy(player:GRoleDefault,type:GOnHookModePlayerEnum):GRoleDefault{
@ -152,13 +207,13 @@ export default class GOnHookMode extends GBaseMode<{}>{
if(type == GOnHookModePlayerEnum.ENEMY) enumyOnes = GOnHookModePlayerEnum.PLAYER if(type == GOnHookModePlayerEnum.ENEMY) enumyOnes = GOnHookModePlayerEnum.PLAYER
//获取敌人 //获取敌人
let roles = this.getOnesRole(enumyOnes); let roles = this.getOnesRoleAlive(enumyOnes);
//返回敌人 //返回敌人
//获取我在第几排 //获取我在第几排
let playerXY = player.tactical.getXY(player.tacticalIndex); let playerXY = player.tactical.getXY(player.tacticalIndex);
//通过排数获取最近的敌人 //通过排数获取最近的敌人
let sort = roles.filter(role => !!role.get()).sort((enumy1,enumy2) => { let sort = roles.sort((enumy1,enumy2) => {
let enumy1XY = enumy1.tactical.getXY(enumy1.tacticalIndex); let enumy1XY = enumy1.tactical.getXY(enumy1.tacticalIndex);
let enumy2XY = enumy2.tactical.getXY(enumy2.tacticalIndex); let enumy2XY = enumy2.tactical.getXY(enumy2.tacticalIndex);
return Math.abs((playerXY.y * 1000) - (enumy1XY.y * 1000)) + Math.abs((playerXY.x - enumy1XY.x)) - return Math.abs((playerXY.y * 1000) - (enumy1XY.y * 1000)) + Math.abs((playerXY.x - enumy1XY.x)) -
@ -181,11 +236,27 @@ export default class GOnHookMode extends GBaseMode<{}>{
if(role.isValid) if(role.isValid)
role.node.destroy() role.node.destroy()
},3000) },3000)
//如果没有敌人则生成敌人 // //如果没有敌人则生成敌人
if(this.getOnesRole(GOnHookModePlayerEnum.ENEMY).filter(role => !!role.get()).length <= 0){ // if(this.getOnesRole(GOnHookModePlayerEnum.ENEMY).filter(role => !!role.get()).length <= 0){
//生成敌人 // //生成敌人
this.onResetGenerateEnemy(); // this.onResetGenerateEnemy();
// }
}
//是否有怪物
isHaveEnemy(){
return this.getOnesRoleAlive(GOnHookModePlayerEnum.ENEMY).filter(role => !!role.get()).length > 0;
}
//前往下一个目标
onNextTarget(){
//如果没有敌人则前往
if(!this.isHaveEnemy()){
//下一个目标点
this.nextFightX = this.nextFightX + this.everyX;
} }
} }
} }

View File

@ -0,0 +1,28 @@
import GFSMBase, { GFSMProcessInfo } from "../../base/fsm/GFSMBase";
import GOnHookMode from "../GOnHookMode";
//流程枚举
enum ProcessEnum {
SeekEnemy = 0, //寻找敌人(场上没有敌人 或者敌人都击杀完)
GenNextFight = 1, //下一个战斗位置
LeaveFight = 2, //前往战斗
GenEnemy = 3, //生成敌人
Fight = 4, //战斗
}
//无限模式的状态类
export default class GFSMOnHookMode extends GFSMBase{
mode:GOnHookMode;
constructor(mode:GOnHookMode){
super();
this.mode = mode;
}
process:{[key:number]:GFSMProcessInfo} = {
}
}