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?:() => number;
|
|
|
|
//前往
|
|
|
|
to?:number[];
|
|
|
|
}
|
|
|
|
|
2023-10-23 18:56:01 +08:00
|
|
|
//状态机基类
|
2023-10-24 02:32:06 +08:00
|
|
|
export default class GFSMBase{
|
|
|
|
|
|
|
|
//状态流程图
|
|
|
|
process:{[key:number]:GFSMProcessInfo} = {};
|
|
|
|
|
|
|
|
//开始流程Id
|
|
|
|
start:number = 0;
|
|
|
|
|
|
|
|
//当前流程
|
|
|
|
current:number = 0;
|
|
|
|
|
|
|
|
//状态机刷新
|
|
|
|
onUpdate(dt:number){
|
|
|
|
|
|
|
|
if(!this.start) this.start = 0;
|
|
|
|
if(!this.current) this.current = 0;
|
|
|
|
|
|
|
|
//运行流程
|
|
|
|
this.execute(this.process[this.current]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//执行流程
|
|
|
|
execute(process:GFSMProcessInfo){
|
|
|
|
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.to[process.execute()-1];
|
|
|
|
break;
|
|
|
|
case GFSMProcessMode.WaitExecute:
|
|
|
|
//执行等待方法
|
|
|
|
let state = process.execute();
|
|
|
|
//如果 状态 -1 则 不重置 下一次状态从当前开始流程执行
|
|
|
|
if(state == -1){
|
|
|
|
isReset = false;
|
|
|
|
}else{
|
|
|
|
next = state;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!this.process[next]) next = null;
|
|
|
|
|
|
|
|
if(next){
|
|
|
|
this.current = next;
|
|
|
|
//运行下一个流程
|
|
|
|
this.execute(this.process[next]);
|
|
|
|
}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
|
|
|
|
|
|
|
}
|