• 状态机代码


    拷贝来自:http://www.cnblogs.com/plateFace/p/5018686.html
    using System;
    namespace StateMachine2.State
    {
    
        public enum AnimationState
        {
            Walk = 1,
            Dead,
        }
    
        public abstract class State
        {
            abstract public int GetStateId{ get; }
            abstract public void Enter(StateEvent data);
            abstract public void Execute(StateEvent data);
            abstract public void Exit(StateEvent data);
        }
    
    
        //状态运行时候的参数
        public class StateEvent
        {
            public string data;
        }
    
        //行走状态
        public class State_Walk : State
        {
            public const int ID = 1;
    
            public override int GetStateId
            {
                get
                {
                    return ID;
                }
            }
    
            public override void Enter(StateEvent data)
            {
                Console.WriteLine("角色行走-进入");
            }
    
            public override void Execute(StateEvent data)
            {
                Console.WriteLine("角色行走-执行中");
            }
    
            public override void Exit(StateEvent data)
            {
                Console.WriteLine("角色行走-退出");
            }
        }
    
        //死亡状态
        public class State_Dead : State
        {
            public const int ID = 2;
            public override int GetStateId
            {
                get
                {
                    return ID;
                }
            }
    
            public override void Enter(StateEvent data)
            {
                Console.WriteLine("角色死亡-进入");
            }
    
            public override void Execute(StateEvent data)
            {
                Console.WriteLine("角色死亡-执行中");
            }
    
            public override void Exit(StateEvent data)
            {
                Console.WriteLine("角色死亡-退出");
            }
        }
    
        public class StateMachine
        {
            private State currentState = null;
            private State previousState = null;
            private StateEvent dataEvent = null;
            private bool isStop;
    
            public State CurrentState
            {
                get
                {
                    return currentState;
                }
            }
            public State PreviousState
            {
                get
                {
                    return previousState;
                }
            }
            public bool IsStop
            {
                get
                {
                    return isStop;
                }
    
                set
                {
                    isStop = value;
                }
            }
    
            private State GetState(AnimationState animationState)
            {
                switch (animationState)
                {
                    case AnimationState.Walk: return new State_Walk();
                    case AnimationState.Dead: return new State_Dead();
                }
                return new State_Walk();
            }
    
            public void ChangeState(AnimationState animationState, StateEvent data,StateEvent previousData = null)
            {
                ChangeState(GetState(animationState),data, previousData);
            }
    
            public void ChangeState(State state,StateEvent data, StateEvent previousData = null)
            {
                //如果切换的状态就是本状态,就退出
                if (currentState != null && state.GetStateId == currentState.GetStateId)
                    return;
    
                //退出上一个状态
                if (previousState != null)
                    previousState.Exit(previousData);
    
                //设置进状态,进入新状态
                currentState = state;
                dataEvent = data;
                currentState.Enter(data);
            }
    
    
    
    
            public void Update()
            {
                if (currentState == null)
                {
                    Console.WriteLine("当前没有状态可以执行");
                    return;
                }
                else if (IsStop)
                {
                    Console.WriteLine("状态机已经停止");
                    return;
                }
                else
                {
                    currentState.Execute(dataEvent);
                }
            }
        }
    
    }
    
    using StateMachine2.State;
    using System;
    
    namespace StateMachine2
    {
        class Program
        {
            static void Main(string[] args)
            {
                StateMachine sm = new StateMachine();
                sm.ChangeState(AnimationState.Walk, new StateEvent() { data = "行走需要的参数" });
                sm.Update();       //执行行走状态 
                sm.Update();       //执行行走状态     
                
                sm.ChangeState(AnimationState.Dead, new StateEvent() { data = "死亡需要的参数" });
                sm.Update();
                sm.IsStop = true;   //停止状态机
    
                sm.Update();        //再次执行状态
    
    
                Console.WriteLine("结束程序");
                Console.ReadLine();
            }
        }
    }
    
  • 相关阅读:
    vsphere client cd/dvd 驱动器1 正在连接
    使用SecureCRT上传和下载文件
    java android 将 List中元素互换位置
    java中Math常用方法
    关于View转化成bitmap保存成图片
    Java中Math类的几个四舍五入方法的区别
    Math.round(),Math.ceil(),Math.floor()的区别
    动态的添加ImageView到LinearLayout中并居中显示
    android之View坐标系(view获取自身坐标的方法和点击事件中坐标的获取)
    Android 代码设置RelativeLayout元素居中
  • 原文地址:https://www.cnblogs.com/wyvern0618/p/8966495.html
Copyright © 2020-2023  润新知