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# 实现简单状态机(参考代码)的更多相关文章

  1. PHP简单登录退出代码

    PHP简单登录退出代码 登录页面login.html 负责收集用户填写的登录信息.  <html> <head> <title></title> < ...

  2. 全网最新最简单的 OpenJDK13 代码编译

    目录 开始咯 1.下载源码 2.安装编译需要的依赖 3.安装 jdk 12 4.检查配置 5.开始编译 6.验证是否成功 回顾 个人博客原文:全网最新最简单的 OpenJDK13 代码编译 最近因写文 ...

  3. js页面跳转参考代码大全

    整理一下JS页面跳转参考代码 第一种:     <script language=/"javascript/" type=/"text/javascript/&qu ...

  4. HTML QQ聊天代码 简单的一行代码

    简单的一行代码: <a href="tencent://message/?uin=173007740&Site=&Menu=yes">和17300774 ...

  5. qt简单界面更新代码(菜鸟级)(部分代码)

    qt简单界面更新代码(菜鸟级)(部分代码)self.timers_1=QtCore.QTimer(self)self.timers_1.timeout.connect(self.min_1)self. ...

  6. Java阶段性测试--第四五六大题参考代码

    第四题:.此题要求用IO流完成 使用File类在D盘下创建目录myFiles, 并在myFiles目录下创建三个文件分别为:info1.txt, info2.txt, info3.txt . 代码: ...

  7. Spring源码学习:第1步--在Spring源码中添加最简单的Demo代码

    为了最大程度地贴近Spring源码并进行学习,一种比较直接的做法是:直接在Spring源码中加入Demo代码,并进行调试. 参照以前使用Spring的经验,Spring最简单的使用方法是:一个实体类. ...

  8. JS实现简单的运行代码 & 侧边广告

    /* JS实现简单的运行代码功能 */<!doctype html> <html> <head> <meta charset="utf-8" ...

  9. 简单的jQ代码

    简单的jQ代码 /* * Lazy Load - jQuery plugin for lazy loading images * * Copyright (c) 2007-2012 Mika Tuup ...

随机推荐

  1. Android软键盘弹出时布局问题

    最近项目需要做一个类似聊天室的模块,基于Socket实现的,这部分稍后一段时间再做总结,功能上的相关点都实现了小例子也做出来了,最后发现一个比较腻歪的问题就是软键盘弹出时总是会把标题“挤出”屏幕,(无 ...

  2. [RxJS] Displaying Initial Data with StartWith

    You often need to render out data before you stream begins from a click or another user interaction. ...

  3. js_day14

  4. Solr 安装与集成IK中文分词器

    创建wangchuanfu core 1.  在example目录下创建wangchuanfu-solr文件夹: 2.  将./solr下的solr.xml拷贝到wangchuanfu-solr目录下 ...

  5. Javascript基础 函数“重载”

    Javascript不像其他编程语言一样具有函数签名(什么是函数签名,简单的说就是说函数的接受参数类型和参数个数,也有人认为返回类型也应该包括.具体概念大家可以到网上查询). 所以Javascript ...

  6. .net 调用Oracle.Data.Access 组件提供的用于批量操作的方法—获取数据库表结构方法和跟参数赋值方法

    1./// <summary> /// 获取当前目标表结构 /// </summary> /// <param name="tableName"> ...

  7. wcf wpf

    转 http://blog.csdn.net/thunder09/article/details/5792157 WPF就是所谓下一代Windows界面层技术,我觉得还有满有前途的.不过Vista发布 ...

  8. Linux中的常见配置文件

    网络服务端口 /etc/services

  9. Java中循环删除list中元素的方法总结

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后在今天使用的时候发现报错了,然后去科普了一下,发现这是一个误区.下面我们来一起看一下. Java中循环遍 ...

  10. JavaScript语法学习笔记

    1.关于执行JavaScript代码的方法: 第一种方法是将JavaScript代码放到文档<head>标签中的<script>标签之间: <head>     & ...