using System; using System.Collections.Generic; namespace TEngine { /// /// 有限状态机管理器。 /// internal sealed class FsmModule : Module, IFsmModule, IUpdateModule { private readonly Dictionary _fsmMap; private readonly List _tempFsmList; /// /// 初始化有限状态机管理器的新实例。 /// public FsmModule() { _fsmMap = new Dictionary(); _tempFsmList = new List(); } /// /// 获取游戏框架模块优先级。 /// /// 优先级较高的模块会优先轮询,并且关闭操作会后进行。 public override int Priority => 1; /// /// 获取有限状态机数量。 /// public int Count => _fsmMap.Count; /// /// 有限状态机管理器轮询。 /// /// 逻辑流逝时间,以秒为单位。 /// 真实流逝时间,以秒为单位。 public void Update(float elapseSeconds, float realElapseSeconds) { _tempFsmList.Clear(); if (_fsmMap.Count <= 0) { return; } foreach (KeyValuePair fsm in _fsmMap) { _tempFsmList.Add(fsm.Value); } foreach (FsmBase fsm in _tempFsmList) { if (fsm.IsDestroyed) { continue; } fsm.Update(elapseSeconds, realElapseSeconds); } } public override void OnInit() { } /// /// 关闭并清理有限状态机管理器。 /// public override void Shutdown() { foreach (KeyValuePair fsm in _fsmMap) { fsm.Value.Shutdown(); } _fsmMap.Clear(); _tempFsmList.Clear(); } /// /// 检查是否存在有限状态机。 /// /// 有限状态机持有者类型。 /// 是否存在有限状态机。 public bool HasFsm() where T : class { return InternalHasFsm(new TypeNamePair(typeof(T))); } /// /// 检查是否存在有限状态机。 /// /// 有限状态机持有者类型。 /// 是否存在有限状态机。 public bool HasFsm(Type ownerType) { if (ownerType == null) { throw new GameFrameworkException("Owner type is invalid."); } return InternalHasFsm(new TypeNamePair(ownerType)); } /// /// 检查是否存在有限状态机。 /// /// 有限状态机持有者类型。 /// 有限状态机名称。 /// 是否存在有限状态机。 public bool HasFsm(string name) where T : class { return InternalHasFsm(new TypeNamePair(typeof(T), name)); } /// /// 检查是否存在有限状态机。 /// /// 有限状态机持有者类型。 /// 有限状态机名称。 /// 是否存在有限状态机。 public bool HasFsm(Type ownerType, string name) { if (ownerType == null) { throw new GameFrameworkException("Owner type is invalid."); } return InternalHasFsm(new TypeNamePair(ownerType, name)); } /// /// 获取有限状态机。 /// /// 有限状态机持有者类型。 /// 要获取的有限状态机。 public IFsm GetFsm() where T : class { return (IFsm)InternalGetFsm(new TypeNamePair(typeof(T))); } /// /// 获取有限状态机。 /// /// 有限状态机持有者类型。 /// 要获取的有限状态机。 public FsmBase GetFsm(Type ownerType) { if (ownerType == null) { throw new GameFrameworkException("Owner type is invalid."); } return InternalGetFsm(new TypeNamePair(ownerType)); } /// /// 获取有限状态机。 /// /// 有限状态机持有者类型。 /// 有限状态机名称。 /// 要获取的有限状态机。 public IFsm GetFsm(string name) where T : class { return (IFsm)InternalGetFsm(new TypeNamePair(typeof(T), name)); } /// /// 获取有限状态机。 /// /// 有限状态机持有者类型。 /// 有限状态机名称。 /// 要获取的有限状态机。 public FsmBase GetFsm(Type ownerType, string name) { if (ownerType == null) { throw new GameFrameworkException("Owner type is invalid."); } return InternalGetFsm(new TypeNamePair(ownerType, name)); } /// /// 获取所有有限状态机。 /// /// 所有有限状态机。 public FsmBase[] GetAllFsms() { int index = 0; FsmBase[] results = new FsmBase[_fsmMap.Count]; foreach (KeyValuePair fsm in _fsmMap) { results[index++] = fsm.Value; } return results; } /// /// 获取所有有限状态机。 /// /// 所有有限状态机。 public void GetAllFsms(List results) { if (results == null) { throw new GameFrameworkException("Results is invalid."); } results.Clear(); foreach (KeyValuePair fsm in _fsmMap) { results.Add(fsm.Value); } } /// /// 创建有限状态机。 /// /// 有限状态机持有者类型。 /// 有限状态机持有者。 /// 有限状态机状态集合。 /// 要创建的有限状态机。 public IFsm CreateFsm(T owner, params FsmState[] states) where T : class { return CreateFsm(string.Empty, owner, states); } /// /// 创建有限状态机。 /// /// 有限状态机持有者类型。 /// 有限状态机名称。 /// 有限状态机持有者。 /// 有限状态机状态集合。 /// 要创建的有限状态机。 public IFsm CreateFsm(string name, T owner, params FsmState[] states) where T : class { TypeNamePair typeNamePair = new TypeNamePair(typeof(T), name); if (HasFsm(name)) { throw new GameFrameworkException(Utility.Text.Format("Already exist FSM '{0}'.", typeNamePair)); } Fsm fsm = Fsm.Create(name, owner, states); _fsmMap.Add(typeNamePair, fsm); return fsm; } /// /// 创建有限状态机。 /// /// 有限状态机持有者类型。 /// 有限状态机持有者。 /// 有限状态机状态集合。 /// 要创建的有限状态机。 public IFsm CreateFsm(T owner, List> states) where T : class { return CreateFsm(string.Empty, owner, states); } /// /// 创建有限状态机。 /// /// 有限状态机持有者类型。 /// 有限状态机名称。 /// 有限状态机持有者。 /// 有限状态机状态集合。 /// 要创建的有限状态机。 public IFsm CreateFsm(string name, T owner, List> states) where T : class { TypeNamePair typeNamePair = new TypeNamePair(typeof(T), name); if (HasFsm(name)) { throw new GameFrameworkException(Utility.Text.Format("Already exist FSM '{0}'.", typeNamePair)); } Fsm fsm = Fsm.Create(name, owner, states); _fsmMap.Add(typeNamePair, fsm); return fsm; } /// /// 销毁有限状态机。 /// /// 有限状态机持有者类型。 /// 是否销毁有限状态机成功。 public bool DestroyFsm() where T : class { return InternalDestroyFsm(new TypeNamePair(typeof(T))); } /// /// 销毁有限状态机。 /// /// 有限状态机持有者类型。 /// 是否销毁有限状态机成功。 public bool DestroyFsm(Type ownerType) { if (ownerType == null) { throw new GameFrameworkException("Owner type is invalid."); } return InternalDestroyFsm(new TypeNamePair(ownerType)); } /// /// 销毁有限状态机。 /// /// 有限状态机持有者类型。 /// 要销毁的有限状态机名称。 /// 是否销毁有限状态机成功。 public bool DestroyFsm(string name) where T : class { return InternalDestroyFsm(new TypeNamePair(typeof(T), name)); } /// /// 销毁有限状态机。 /// /// 有限状态机持有者类型。 /// 要销毁的有限状态机名称。 /// 是否销毁有限状态机成功。 public bool DestroyFsm(Type ownerType, string name) { if (ownerType == null) { throw new GameFrameworkException("Owner type is invalid."); } return InternalDestroyFsm(new TypeNamePair(ownerType, name)); } /// /// 销毁有限状态机。 /// /// 有限状态机持有者类型。 /// 要销毁的有限状态机。 /// 是否销毁有限状态机成功。 public bool DestroyFsm(IFsm fsm) where T : class { if (fsm == null) { throw new GameFrameworkException("FSM is invalid."); } return InternalDestroyFsm(new TypeNamePair(typeof(T), fsm.Name)); } /// /// 销毁有限状态机。 /// /// 要销毁的有限状态机。 /// 是否销毁有限状态机成功。 public bool DestroyFsm(FsmBase fsm) { if (fsm == null) { throw new GameFrameworkException("FSM is invalid."); } return InternalDestroyFsm(new TypeNamePair(fsm.OwnerType, fsm.Name)); } private bool InternalHasFsm(TypeNamePair typeNamePair) { return _fsmMap.ContainsKey(typeNamePair); } private FsmBase InternalGetFsm(TypeNamePair typeNamePair) { FsmBase fsm = null; if (_fsmMap.TryGetValue(typeNamePair, out fsm)) { return fsm; } return null; } private bool InternalDestroyFsm(TypeNamePair typeNamePair) { FsmBase fsm = null; if (_fsmMap.TryGetValue(typeNamePair, out fsm)) { fsm.Shutdown(); return _fsmMap.Remove(typeNamePair); } return false; } } }