U3D架构系列之- FSM有限状态机设计四

接下来,我们继续我们的FSM有限状态机的设计,在设计三中我们实现了FSState这个类,我们继续实现FSEvent事件处理类。在FSEvent类里面我们声明了FiniteStateMachine里面定义的委托函数。代码如下:

	protected FiniteStateMachine.EnterState mEnterDelegate;
	protected FiniteStateMachine.PushState mPushDelegate;
	protected FiniteStateMachine.PopState mPopDelegate;

同时我们定义了一个枚举用于处理有限状态机的状态,使用了System里面自带的封装的一个具有三个参数并返回TResult参数制定的雷兴志的方法。

public Func<object,object,object,bool>	mAction = null;

这个FSEvent事件类也是独立的,不继承Mono。它的核心功能主要是处理FSState的Enter,Push,Pop。代码如下:

public FSState Enter(string stateName) {
		mTargetState = stateName;
		eType = EventType.ENTER;
		return mStateOwner;
	}

	public FSState Push(string stateName) {
		mTargetState = stateName;
		eType = EventType.PUSH;
		return mStateOwner;
	}

	public void Pop() {
		eType = EventType.POP;
	}

	public void Execute(object o1,object o2,object o3) {
		if (eType == EventType.POP) {
			mPopDelegate();
		}
		else if (eType == EventType.PUSH) {
			mPushDelegate(mTargetState, mOwner.CurrentState.StateName);
		}
		else if (eType == EventType.ENTER) {
			mEnterDelegate(mTargetState);
		}
		else if (mAction != null) {
			mAction(o1, o2, o3);
		}
	}

总的来说,FSEvent是通过调用Enter,Push,Pop,Execute执行状态的切换。下面把整个代码给大家展现一下:

using System;

public class FSEvent {
	protected FiniteStateMachine.EnterState mEnterDelegate;
	protected FiniteStateMachine.PushState mPushDelegate;
	protected FiniteStateMachine.PopState mPopDelegate;

	protected enum EventType { NONE, ENTER, PUSH, POP };
	protected string mEventName;
	protected FSState mStateOwner;
	protected string mTargetState;
	protected FiniteStateMachine mOwner;
	protected EventType eType;
	public Func<object,object,object,bool>	mAction = null;

	public FSEvent(string name, string target, FSState state, FiniteStateMachine owner, FiniteStateMachine.EnterState e, FiniteStateMachine.PushState pu, FiniteStateMachine.PopState po) {
		mStateOwner = state;
		mEventName = name;
		mTargetState = target;
		mOwner = owner;
		eType = EventType.NONE;
		mEnterDelegate = e;
		mPushDelegate = pu;
		mPopDelegate = po;
	}

	public FSState Enter(string stateName) {
		mTargetState = stateName;
		eType = EventType.ENTER;
		return mStateOwner;
	}

	public FSState Push(string stateName) {
		mTargetState = stateName;
		eType = EventType.PUSH;
		return mStateOwner;
	}

	public void Pop() {
		eType = EventType.POP;
	}

	public void Execute(object o1,object o2,object o3) {
		if (eType == EventType.POP) {
			mPopDelegate();
		}
		else if (eType == EventType.PUSH) {
			mPushDelegate(mTargetState, mOwner.CurrentState.StateName);
		}
		else if (eType == EventType.ENTER) {
			mEnterDelegate(mTargetState);
		}
		else if (mAction != null) {
			mAction(o1, o2, o3);
		}
	}
}

设计四把FSM常用的类已经封装好了,接下来我们会在设计五中去封装一个EventSystem类。用于处理事件的注册,分发等功能。

时间: 2024-08-25 14:37:31

U3D架构系列之- FSM有限状态机设计四的相关文章

U3d架构系列之-FSM有限状态机设计一

我们在游戏开发中经常面临架构设计问题,在蛮牛问答里面也有好多朋友问关于架构方面的问题,在这里我就将一些经常使用的游戏开发方面的知识跟大家介绍 一下, 一是给大家提供一个设计思路,在此基础上可以举一反三,二是大家可以通过这个平台共同学习.闲话不多说了,切入正题,FSM有限状态机,在游戏开发中如何使用?那些模块的设计需要它?接下来我们就分析一下游戏: 比如我们的玩家自身的状态切换,Idle,walk,attack等等,这些都属于状态的切换,可以用有限状态机:还有比如玩家去完任务:领取任务,杀怪,交易

U3D架构系列之- FSM有限状态机设计六(总结篇)

由于最近一直赶项目进度,没时间写,昨晚终于项目终于完成了,空闲下来,做一个总结.在这一篇中主要是把前五章一起总结一下,以及通过举例演示如何使用?有限状态机在游戏中使用的地方非常多,比如我们界面之间的切换,角色的状态切换等等.所以非常值得大家去学习一下,接下来我们主要实现的功能,为了表达清楚,我通过图例给大家说明一下: 给大家解析一下,程序运行首先进入主菜单,里面有三个按钮,开始游戏,音量,退出游戏.先从第一个说起,如果是开始游戏,它会进入到下一个界面游戏界面,游戏界面有个返回主菜单功能.二者可以

U3D架构系列之- FSM有限状态机设计三

在设计二中,我们实现了有限状态机管理类,接下来,我们实现FSState这个类,这里类主要是状态的基本操作以及事件触发.在这里我们定义了在FiniteStateMachine类里声明的三个委托.在FSState里面使用的代码如下: protected FiniteStateMachine.EnterState mEnterDelegate; protected FiniteStateMachine.PushState mPushDelegate; protected FiniteStateMach

U3D架构系列之- FSM有限状态机设计五

在设计五中,我们把事件系统EventSystem实现一下.这个EventSystem类主要实现的是事件的注册,触发,以及分发Event消息的作用.提供接口对外使用的.在这里面为了功能扩展方便用了好多模板函数,方便大家调用. 分发消息的时候,我们采用的是队列的方式,就是先进先出原则. 首先要把消息事件注册一下,就是将其放到我们预先定义的表里面.函数代码如下所示: int Register(string eventName, Func<object,object,object,bool> acti

GPS部标平台的架构设计(四)-百度地图设计

部标GPS软件平台之百度地图设计 地图是客户端中不可缺少的一个模块,很多人在设计和画图时候,喜欢加上地图引擎这样高大上的字眼,显得自己的平台有内涵,说白了就是用第三方的SDK来开发,早期的GPS监 控软件用的都是mapx.mapxtrem.acrgis之类的,使用的都是本地地图.不仅要购买正版地图,还要购买价格不菲的地图引擎license,服务器版的部署的时候,还要绑定到服务器ID上,现在这种开发方式已被抛弃.现在的百度地图.谷歌地图提供的SDK接口丰富,开发方便,系统稳定,大家都用的很爽. 在

大型网站架构系列:消息队列(二)

本文是大型网站架构系列:消息队列(二),主要分享JMS消息服务,常用消息中间件(Active MQ,Rabbit MQ,Zero MQ,Kafka).[第二篇的内容大部分为网络资源的整理和汇总,供大家学习总结使用,最后有文章来源] 本次分享大纲 消息队列概述(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息队列应用场景(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息中间件示例(见第一篇:大型网站架构系列:分布式消息队列(一)) JMS消息服务 常用消息队列 参考(推荐)资料 本

大型网站架构系列:20本技术书籍推荐

学习是技术人员成长的基础,本次分享20本技术方面的书籍,这些书不是每一本都是经典,但是每一本都有其特点.以下20本大部分本人都看过,因此推荐给大家.(本次推荐的20本只是一个参考,比如像Head First,Java编程思想等经典书籍是大家都知道,因此不在推荐之列) 本次分享大纲 大型网站架构系列 分布式系统系列 BAT技术文学系列 架构设计系列 本次分享总结 一.大型网站架构系列 第一本:<大型网站技术架构:核心原理与案例分析> 这是本算是国内大型网站架构的经典之作,由阿里人李智慧创作,听名

大型网站架构系列:消息队列(二) (转)

本文是大型网站架构系列:消息队列(二),主要分享JMS消息服务,常用消息中间件(Active MQ,Rabbit MQ,Zero MQ,Kafka).[第二篇的内容大部分为网络资源的整理和汇总,供大家学习总结使用,最后有文章来源] 本次分享大纲 消息队列概述(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息队列应用场景(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息中间件示例(见第一篇:大型网站架构系列:分布式消息队列(一)) JMS消息服务 常用消息队列 参考(推荐)资料 本

【转载】大型网站架构系列20本书

[转载]http://www.cnblogs.com/chy2055/p/5181352.html 学习是技术人员成长的基础,本次分享20本技术方面的书籍,这些书不是每一本都是经典,但是每一本都有其特点.以下20本大部分本人都看过,因此推荐给大家.(本次推荐的20本只是一个参考,比如像Head First,Java编程思想等经典书籍是大家都知道,因此不在推荐之列) 本次分享大纲 大型网站架构系列 分布式系统系列 BAT技术文学系列 架构设计系列 本次分享总结 一.大型网站架构系列 第一本:<大型