/// <summary> /// 更新现有的状态 /// </summary> /// <param name="t_FSMStateName">要更新的现有状态的键索引</param> /// <param name="t_BaseFSMState">要替换的状态实例</param> public void UpdateState(string t_FSMStateName, BaseFSMState t_BaseFSMState) { if (IStateMapDataStructure.ContainsKey(t_FSMStateName)) { IStateMapDataStructure.Update(t_FSMStateName, t_BaseFSMState); } }
/// <summary> /// 添加状态 /// </summary> /// <param name="t_StateType">状态的抽象基类类型</param> public void AddState(BaseFSMState t_BaseFSMState) { if (null == t_BaseFSMState) { throw new GameBoxFrameworkException(string.Format("添加的状态不能为空!")); } if (!string.IsNullOrEmpty(t_BaseFSMState.StateName)) { if (IStateMapDataStructure.ContainsKey(t_BaseFSMState.StateName)) { throw new GameBoxFrameworkException(string.Format("状态'{0}'已经存在!", t_BaseFSMState.GetType().Name)); } IStateMapDataStructure.Add(t_BaseFSMState.StateName, t_BaseFSMState); } else { if (IStateMapDataStructure.ContainsKey(t_BaseFSMState.GetType().Name)) { throw new GameBoxFrameworkException(string.Format("状态'{0}'已经存在!", t_BaseFSMState.GetType().Name)); } IStateMapDataStructure.Add(t_BaseFSMState.GetType().Name, t_BaseFSMState); // 如果改状态没有名字,那么改状态就采用状态的类名 } t_BaseFSMState.OnStateInit(this); //初始化状态机 }
/// <summary> /// 获取所有状态 /// </summary> /// <returns>基础状态数组</returns> public BaseFSMState[] GetAllState() { BaseFSMState[] t_BaseFSMStates = new BaseFSMState[IStateMapDataStructure.Count]; var t_StateMaps = IStateMapDataStructure.ToArray(); for (int i = 0; i < t_StateMaps.Length; i++) { t_BaseFSMStates[i] = t_StateMaps[i].Value; } return(t_BaseFSMStates); }
/// <summary> /// 更改状态机状态 /// </summary> /// <param name="t_StateType"></param> public void ChangeState(Type t_StateType) { if (IsRunning) { IStateMapDataStructure.Foreach((key, value) => { if (value.GetType() == t_StateType) { m_TempState = value; } }); } }
/// <summary> /// 更改状态机状态 /// </summary> /// <param name="t_StateName">状态的名字</param> public void ChangeState(string t_StateName) { if (IsRunning) { IStateMapDataStructure.Foreach((key, value) => { if (key == t_StateName) { m_TempState = value; } }); } }
/// <summary> /// 更改状态机状态 /// </summary> /// <param name="t_BaseFSMState">更改的目标状态</param> public void ChangeState(BaseFSMState t_BaseFSMState) { if (IsRunning) { IStateMapDataStructure.Foreach((key, value) => { if (value.Equals(t_BaseFSMState)) { m_TempState = value; } }); } }
/// <summary> /// 轮询更新状态 /// </summary> private void UpdateState() { if (null == m_TempState) { throw new GameBoxFrameworkException(string.Format("状态机 '{0}' 没有被赋予初始状态!", m_FSMName)); } if (!m_TempState.Equals(State)) //如果当前的临时状态和当前状态不是处于一个状态,那么状态已经被更改了 { if (null != State) //如果当前状态已经被初始化 { State.OnStateExit(this); //上一个状态 退出 State.StateStayRealWorldTime = 0; //清0时间 State.StateStayGameWorldTime = 0; //清0时间 LastState = State; //保存上一个状态 } State = m_TempState; //更新当前状态 if (null != StateChangedEventHandler) { StateChangedEventHandler(new FSMEventArgs() { IFSM = this, LastState = LastState, State = State }); //事件通知 } State.OnStateEnter(this); //当前状态 进入 } else { State.OnStateLoop(this); //当前状态 轮询 State.StateStayTotalGameWorldTime += GameBoxFrameworkTime.GameWorldElapsedTime; //状态的游戏世界总的流逝时间 State.StateLoopGameWorldTime = GameBoxFrameworkTime.GameWorldElapsedTime; //状态的游戏世界总的流逝时间 State.StateStayGameWorldTime += GameBoxFrameworkTime.GameWorldElapsedTime; //状态从进入开始到现在的游戏世界总的流逝时间,退出后会被重置为0 State.StateStayTotalRealWorldTime += GameBoxFrameworkTime.RealWorldElapsedTime; //状态的真实世界流逝时间 State.StateLoopRealWorldTime = GameBoxFrameworkTime.RealWorldElapsedTime; //状态的真实世界流逝时间 State.StateStayRealWorldTime += GameBoxFrameworkTime.RealWorldElapsedTime; //状态从进入开始到现在的游戏世界总的流逝时间,退出后会被重置为0 } }
/// <summary> /// 初始化状态的条件构造方法 /// </summary> /// <param name="t_State"></param> public BaseFSMCondition(BaseFSMState t_State) { }