DOF/sqr/User/Object/StateMachine/StateMachineClass.nut

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