126 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			126 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | /* | ||
|  | 文件名:StateMachineClass.nut | ||
|  | 路径:User/Object/StateMachine/StateMachineClass.nut | ||
|  | 创建日期:2024-11-29	23:14 | ||
|  | 文件用途:状态机 | ||
|  | */ | ||
|  | class FiniteStateMachineClass { | ||
|  | 
 | ||
|  |     //状态 | ||
|  |     State = -1; | ||
|  |     //状态时间 | ||
|  |     StateTime = 0; | ||
|  | 
 | ||
|  |     //状态注册组 | ||
|  |     StateFuncArr = null; | ||
|  |     //条件注册组 | ||
|  |     ConditionStateArr = null; | ||
|  | 
 | ||
|  |     constructor() { | ||
|  |         //初始化 | ||
|  |         StateFuncArr = {}; | ||
|  |         //初始化 | ||
|  |         ConditionStateArr = {}; | ||
|  |     } | ||
|  | 
 | ||
|  |     //状态检查 | ||
|  |     function OnCheck(gState) { | ||
|  |         if ("OnCheck" in StateFuncArr[gState]) { | ||
|  |             local Flag = StateFuncArr[gState].OnCheck(); | ||
|  |             if (Flag) return Flag; | ||
|  |             else return false; | ||
|  |         } else return true; | ||
|  |     } | ||
|  | 
 | ||
|  |     //状态进入 | ||
|  |     function OnStart() { | ||
|  |         if ("OnStart" in StateFuncArr[State]) StateFuncArr[State].OnStart(); | ||
|  |     } | ||
|  | 
 | ||
|  |     //状态退出 | ||
|  |     function OnEnd() { | ||
|  |         if ("OnEnd" in StateFuncArr[State]) StateFuncArr[State].OnEnd(); | ||
|  |     } | ||
|  | 
 | ||
|  |     //状态中全帧 | ||
|  |     function OnProc(dt) { | ||
|  |         if ("OnProc" in StateFuncArr[State]) StateFuncArr[State].OnProc(dt, StateTime); | ||
|  |     } | ||
|  | 
 | ||
|  |     //状态中144 | ||
|  |     function OnProcFrom144(MillisecondsDuration) { | ||
|  |         if ("OnProcCon" in StateFuncArr[State]) StateFuncArr[State].OnProcCon(MillisecondsDuration); | ||
|  |         foreach(Key, Func in ConditionStateArr) { | ||
|  |             if (Func()) ChangeState(Key); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     //注册普通状态 | ||
|  |     function RegisterStaticState(StateIndex, T) { | ||
|  |         StateFuncArr.rawset(StateIndex, T); | ||
|  |     } | ||
|  | 
 | ||
|  |     //注册条件状态 | ||
|  |     function RegisterConditionState(StateIndex, Func) { | ||
|  |         ConditionStateArr.rawset(StateIndex, Func); | ||
|  |     } | ||
|  | 
 | ||
|  |     //更改状态 | ||
|  |     function ChangeState(StateIndex) { | ||
|  |         //判断有这个状态才执行 | ||
|  |         if (StateIndex in StateFuncArr) { | ||
|  |             //如果有检查 先调用检查 | ||
|  |             local Flag = OnCheck(StateIndex); | ||
|  |             //如果Flag成立 | ||
|  |             if (Flag) { | ||
|  |                 //如果自身状态不等于-1 | ||
|  |                 if (State != -1) { | ||
|  |                     //调用状态退出 | ||
|  |                     OnEnd(); | ||
|  |                 } | ||
|  |                 //更新状态 | ||
|  |                 State = StateIndex; | ||
|  |                 //重置状态时间 | ||
|  |                 StateTime = 0; | ||
|  | 
 | ||
|  |                 //调用状态进入 | ||
|  |                 OnStart(); | ||
|  |                 return true; | ||
|  |             } else return false; | ||
|  |         } else return false; | ||
|  |     } | ||
|  | 
 | ||
|  |     //Ani播放KeyFlag | ||
|  |     function ChangeAniKeyFlag(Index) { | ||
|  |         if ("OnAniKeyFlag" in StateFuncArr[State]) StateFuncArr[State].OnAniKeyFlag(Index); | ||
|  |     } | ||
|  | 
 | ||
|  |     //Ani播放完成回调 | ||
|  |     function ChangeAniEndFlag() { | ||
|  |         if ("OnAniEndFlag" in StateFuncArr[State]) StateFuncArr[State].OnAniEndFlag(); | ||
|  |     } | ||
|  | 
 | ||
|  |     //攻击到目标的回调 | ||
|  |     function ChangeOnAttack(Damager) { | ||
|  |         if ("OnAttack" in StateFuncArr[State]) StateFuncArr[State].OnAttack(Damager); | ||
|  |     } | ||
|  | 
 | ||
|  |     //状态机持续执行函数 144帧 | ||
|  |     function OnUpdateFrom144(MillisecondsDuration) { | ||
|  |         //如果自身状态不等于-1 | ||
|  |         if (State != -1) { | ||
|  |             //状态中144 | ||
|  |             OnProcFrom144(MillisecondsDuration); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     //状态机持续执行函数 | ||
|  |     function OnUpdate(dt) { | ||
|  |         StateTime += dt; | ||
|  |         //如果自身状态不等于-1 | ||
|  |         if (State != -1) { | ||
|  |             //状态中 | ||
|  |             OnProc(dt); | ||
|  |         } | ||
|  |     } | ||
|  | } |