109 lines
2.6 KiB
TypeScript
Raw Normal View History

import { JNFrameInfo } from "../../../../../extensions/ngame/assets/ngame/sync/frame/JNSyncFrame";
2023-10-23 18:56:01 +08:00
2023-10-24 02:32:06 +08:00
//流程模式
export enum GFSMProcessMode{
Execute,//正常运行
WaitExecute,//等待执行
}
//流程信息
export interface GFSMProcessInfo{
//备注
title:string;
//模式
mode?:GFSMProcessMode;
//执行方法
execute?:(dt:number,info:GFSMProcessInfo,frame:JNFrameInfo) => number;
2023-10-24 02:32:06 +08:00
//前往
to?:number[];
}
2023-10-24 19:12:25 +08:00
//流程枚举
export enum GFSMProcessEnum{
Reset = -1,//重置
Wait = -2,//等待
}
2023-10-23 18:56:01 +08:00
//状态机基类
2023-10-24 02:32:06 +08:00
export default class GFSMBase{
2023-10-25 19:19:52 +08:00
//是否关闭
isClose:boolean = false;
2023-10-24 02:32:06 +08:00
//状态流程图
process:{[key:number]:GFSMProcessInfo} = {};
//开始流程Id
start:number = 0;
//当前流程
current:number = 0;
//状态机刷新
onUpdate(dt:number,frame:JNFrameInfo){
2023-10-24 02:32:06 +08:00
2023-10-25 19:19:52 +08:00
if(this.isClose) return;
2023-10-24 02:32:06 +08:00
if(!this.start) this.start = 0;
if(!this.current) this.current = 0;
//运行流程
this.execute(this.process[this.current],dt,frame);
2023-10-24 02:32:06 +08:00
}
2023-10-25 19:19:52 +08:00
close(){
this.isClose = true;
}
2023-10-31 01:52:46 +08:00
open(){
2023-10-31 02:34:12 +08:00
this.current = 0;
2023-10-31 01:52:46 +08:00
this.isClose = false;
}
2023-10-24 02:32:06 +08:00
//执行流程
execute(process:GFSMProcessInfo,dt:number,frame:JNFrameInfo){
2023-10-24 02:32:06 +08:00
if(!process) return;
process.mode = process.mode || GFSMProcessMode.Execute;
process.to = process.to || [];
let next:number;
let isReset:boolean = true;
//执行流程
switch(process.mode){
case GFSMProcessMode.Execute:
//执行方法
next = process.execute(dt,process,frame);
2023-10-24 02:32:06 +08:00
break;
case GFSMProcessMode.WaitExecute:
//执行等待方法
next = process.execute(dt,process,frame);
2023-10-24 19:12:25 +08:00
//如果 状态 Wait 则 不重置 下一次状态从当前开始流程执行
if(next == GFSMProcessEnum.Wait){
2023-10-24 02:32:06 +08:00
isReset = false;
}
break;
}
2023-10-24 19:12:25 +08:00
if(process.to.indexOf(next) == -1 && next != GFSMProcessEnum.Wait && next != GFSMProcessEnum.Reset){
console.log(`[GFSM]: 流程To中没有这个流程 请检查代码`,process,next);
2023-11-04 05:56:28 +08:00
return;
2023-10-24 19:12:25 +08:00
}
2023-10-24 02:32:06 +08:00
if(!this.process[next]) next = null;
if(next){
this.current = next;
//运行下一个流程
this.execute(this.process[next],dt,frame);
2023-10-24 02:32:06 +08:00
}else{
if(isReset){
//重置
this.current = this.start;
}
}
2023-10-23 18:56:01 +08:00
2023-10-24 02:32:06 +08:00
}
2023-10-23 18:56:01 +08:00
}