C# 实现简单状态机(参考代码)
2015-12-04 11:00
603 查看
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(); } } }
效果图:
相关文章推荐
- C#使用ImitateLogin模拟登录百度
- C#加密方法总汇
- c# 退出
- 基于CC2530的温湿度传感器和基于C#的应用界面设计
- C#中通过位运算实现多个状态的判断
- C#按钮替换图片
- c#页面缓存
- C#开发串口总结,并提炼串口辅助类到公用类库中
- 【C#】Socket客户端与服务器的简单通信
- 详解C#正则表达式Regex常用匹配
- C# UML类图及类之间的几种关系
- C#正则表达式Regex常用匹配
- C#_字符串拆分Split实例方法
- C#_字符串截取Substring实例方法
- C#_格式化输入日期时间
- C#_字符串中的Compare和Equal方法
- C#_is运算符,new运算符,typeof运算符
- C#_位操作
- C#6.0特性笔记
- C#上位机之多编辑框输出