Example #1
0
        public static void Test()
        {
            FiniteStateMachine <Monster> monsterStateMachine = new FiniteStateMachine <Monster>(new MonsterStateProcesser <Monster>(), new MonsterOnStateChangeProcess <Monster>());
            FiniteState <Monster>        wait = monsterStateMachine.AddState(Monster.STATE_WAIT);

            wait.SetStateExecutor(new MonsterWaitExecutor <Monster>());
            FiniteState <Monster> battle = monsterStateMachine.AddState(Monster.STATE_BATTLE);

            battle.SetStateExecutor(new MonsterBattleExecutor <Monster>());
            FiniteState <Monster> charse = monsterStateMachine.AddState(Monster.STATE_CHARSE);

            charse.SetStateExecutor(new MonsterCharseExecutor <Monster>());
            monsterStateMachine.setDefaultState(wait);

            // 待机>战斗
            // 存在目标
            FiniteStateTransaction <Monster> wait2Battle = monsterStateMachine.AddTranscation(wait, battle);

            wait2Battle.AddCondition(new BoolCondition(Monster.KEY_TARGET_EXIST, true));

            // 追击>战斗
            // 和目标的距离小于攻击距离
            FiniteStateTransaction <Monster> move2Battle = monsterStateMachine.AddTranscation(charse, battle);

            move2Battle.AddCondition(new IntCondition(Monster.KET_DISTANCE, IntCondition.SMALLER, Monster.ATTACK_RANGE));

            // 追击>待机
            // 目标死亡
            FiniteStateTransaction <Monster> move2Wait = monsterStateMachine.AddTranscation(charse, wait);

            move2Wait.AddCondition(new BoolCondition(Monster.KEY_TARGET_DEAD, true));

            // 战斗>移动
            // 和目标的距离大于攻击距离
            FiniteStateTransaction <Monster> battle2Move = monsterStateMachine.AddTranscation(battle, charse);

            battle2Move.AddCondition(new IntCondition(Monster.KET_DISTANCE, IntCondition.LARGER, Monster.ATTACK_RANGE));

            // 战斗>待机
            // 目标死亡
            FiniteStateTransaction <Monster> battle2Wait = monsterStateMachine.AddTranscation(battle, wait);

            battle2Wait.AddCondition(new BoolCondition(Monster.KEY_TARGET_DEAD, true));

            Monster m = new Monster();

            for (int i = 0; i < 10; i++)
            {
                monsterStateMachine.Tick(m, 0, 0);
            }
        }