using System;
namespace TEngine
{
///
/// 有限状态机状态基类。
///
/// 有限状态机持有者类型。
public abstract class FsmState where T : class
{
///
/// 初始化有限状态机状态基类的新实例。
///
public FsmState()
{
}
///
/// 有限状态机状态初始化时调用。
///
/// 有限状态机引用。
protected internal virtual void OnInit(IFsm fsm)
{
}
///
/// 有限状态机状态进入时调用。
///
/// 有限状态机引用。
protected internal virtual void OnEnter(IFsm fsm)
{
}
///
/// 有限状态机状态轮询时调用。
///
/// 有限状态机引用。
/// 逻辑流逝时间,以秒为单位。
/// 真实流逝时间,以秒为单位。
protected internal virtual void OnUpdate(IFsm fsm, float elapseSeconds, float realElapseSeconds)
{
}
///
/// 有限状态机状态离开时调用。
///
/// 有限状态机引用。
/// 是否是关闭有限状态机时触发。
protected internal virtual void OnLeave(IFsm fsm, bool isShutdown)
{
}
///
/// 有限状态机状态销毁时调用。
///
/// 有限状态机引用。
protected internal virtual void OnDestroy(IFsm fsm)
{
}
///
/// 切换当前有限状态机状态。
///
/// 要切换到的有限状态机状态类型。
/// 有限状态机引用。
protected void ChangeState(IFsm fsm) where TState : FsmState
{
Fsm fsmImplement = (Fsm)fsm;
if (fsmImplement == null)
{
throw new GameFrameworkException("FSM is invalid.");
}
fsmImplement.ChangeState();
}
///
/// 切换当前有限状态机状态。
///
/// 有限状态机引用。
/// 要切换到的有限状态机状态类型。
protected void ChangeState(IFsm fsm, Type stateType)
{
Fsm fsmImplement = (Fsm)fsm;
if (fsmImplement == null)
{
throw new GameFrameworkException("FSM is invalid.");
}
if (stateType == null)
{
throw new GameFrameworkException("State type is invalid.");
}
if (!typeof(FsmState).IsAssignableFrom(stateType))
{
throw new GameFrameworkException(Utility.Text.Format("State type '{0}' is invalid.", stateType.FullName));
}
fsmImplement.ChangeState(stateType);
}
}
}