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