Beispiel #1
0
 /// <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);
     }
 }
Beispiel #2
0
        /// <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); //初始化状态机
        }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
 /// <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;
             }
         });
     }
 }
Beispiel #5
0
 /// <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;
             }
         });
     }
 }
Beispiel #6
0
 /// <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;
             }
         });
     }
 }
Beispiel #7
0
        /// <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
            }
        }
Beispiel #8
0
 /// <summary>
 /// 初始化状态的条件构造方法
 /// </summary>
 /// <param name="t_State"></param>
 public BaseFSMCondition(BaseFSMState t_State)
 {
 }