Exemple #1
0
        public StateTransition Clone()
        {
            var st = new StateTransition();

            st.TransitionCondition = TransitionCondition;
            st.FromState           = FromState;
            st.ToState             = ToState;
            st.RunTime             = RunTime;
            st.Reset = Reset;

            return(st);
        }
Exemple #2
0
        // 检查状态迁移
        bool CheckTransition(Fix64 te)
        {
            // 要生效的迁移条件
            StateTransition tToWork = null;

            if (!running)
            {
                return(false);
            }

            // 当前状态下的迁移条件
            foreach (var t in trans[curState])
            {
                if (t.RunTime != null)
                {
                    t.RunTime(te);
                }

                if (!running) // 状态可能已经迁移了
                {
                    break;
                }

                if (t.TransitionCondition != null && t.TransitionCondition(CurSt))
                {
                    tToWork = t;
                    break;
                }
            }

            // 没有满足条件的就算了
            if (tToWork == null)
            {
                return(false);
            }

            // 执行迁移操作

            if (CurSt.RunOut != null)
            {
                CurSt.RunOut(tToWork.ToState);
            }

            if (!running) // 状态可能已经迁移了
            {
                return(true);
            }

            var fromState = curState;

            curState = tToWork.ToState;

            if (CurSt.RunIn != null)
            {
                CurSt.RunIn(fromState);
            }

            if (!running) // 状态可能已经迁移了
            {
                return(true);
            }

            // 新状态下的所有迁移条件重置一次
            if (trans.ContainsKey(curState))
            {
                foreach (var nt in trans[curState])
                {
                    if (nt.Reset != null)
                    {
                        nt.Reset();
                    }
                }
            }

            return(true);
        }