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. (转)iOS7界面设计规范(3) - UI基础 - 启动与退出

    周二晚间来第三发,搞得好像今天是周六的赶脚.发掉之后再奖励自己一点冰啤酒吧,然后扑床去.天气热起来了,各位注意防暑降温呗.走起. 重要:这是针对于正在开发中的API或技术的预备文档(预发布版本).虽然 ...

  2. [置顶] STM32移植contiki进阶之三(中):timer 中文版

    鉴于自己英语水平不高,在这里,将上一篇关于contiki 的timer的文章翻译为中文,让自己在学习的时候,更方便点.文中有许多不是很通顺的地方,将就吧. Timers Contiki系统提供了一套时 ...

  3. [Redux] React Todo List Example (Filtering Todos)

    /** * A reducer for a single todo * @param state * @param action * @returns {*} */ const todo = ( st ...

  4. [Redux] Passing the Store Down with <Provider> from React Redux

    Previously, we wrote the Provider component by ourself: class Provider extends Component { getChildC ...

  5. 【转载】CocoaPods安装和使用教程

    转自:http://code4app.com/article/cocoapods-install-usage 目录 CocoaPods是什么? 如何下载和安装CocoaPods? 如何使用CocoaP ...

  6. javascript 打开新窗口(window.open)

    打开新窗口(window.open) open() 方法可以查找一个已经存在或者新建的浏览器窗口. 语法: window.open([URL], [窗口名称], [参数字符串]) 参数说明: URL: ...

  7. Objective-C中的单例模式(工具类)

    单例是iOS开发中经常会用到的一种设计模式,顾名思义,即创建一个类,该类在整个程序的生命周期中只有一个实例对象,无论是通过new,alloc init,copy等方法创建,或者创建多少个对象,自始至终 ...

  8. JS常用验证方法

    1.验证必须为数字(可有小数点) if(isNaN(value))execCommand('undo') 说明:1.isNaN()方法用于验证value值是否为非法数字,返回值true或者false. ...

  9. js delete 用法

    1,对象属性删除   function fun(){ this.name = 'mm'; } var obj = new fun(); console.log(obj.name);//mm delet ...

  10. php的一些小笔记-文件函数(2)

    ---恢复内容开始--- copy 文件的复制 echo copy('test.php','test1.php'); 如果成功的返回true,反之返回false 如何在多层目录中复制文件呢?也就是根据 ...