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);
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |