U3D架构系列之- FSM有限状态机设计五
来源:互联网 发布:java 判断奇数偶数 编辑:程序博客网 时间:2024/05/17 23:07
在设计五中,我们把事件系统EventSystem实现一下。这个EventSystem类主要实现的是事件的注册,触发,以及分发Event消息的作用。提供接口对外使用的。在这里面为了功能扩展方便用了好多模板函数,方便大家调用。
分发消息的时候,我们采用的是队列的方式,就是先进先出原则。
首先要把消息事件注册一下,就是将其放到我们预先定义的表里面。函数代码如下所示:
接下来就是 消息事件的触发代码如下:
遍历查找消息列表是否在mRegistererdEvents这个字典里面,mRegisteredEvents的定义如下:
Listen的定义如下:
接下来就是最核心的功能了,状态机的切换功能代码:
整个的EventSystem事件系统的代码如下所示:
using System;
using System.Collections;
using System.Collections.Generic;
namespace EventSystem {
public class Dispatcher {
public void Trigger(string eventName) {
Call(eventName, null, null, null);
}
public void Dispatch(string eventName) {
Dispatched d = (mFreeDispatch.Count == 0) ? new Dispatched() : mFreeDispatch.Pop();
mDispatched.Enqueue(d.Set(eventName));
}
public int On(string eventName, Func action) {
return Register(eventName, delegate(object arg1, object arg2, object arg3) {
return(action());
});
}
public int On(string eventName, Action action) {
return Register(eventName, delegate(object arg1, object arg2, object arg3) {
action();
return(true);
});
}
public void Trigger(string eventName, object param1) {
Call(eventName, param1, null, null);
}
public void Dispatch(string eventName, object param1) {
Dispatched d = (mFreeDispatch.Count == 0) ? new Dispatched() : mFreeDispatch.Pop();
mDispatched.Enqueue(d.Set(eventName, param1));
}
public int On(string eventName, Func action) {
return Register(eventName, delegate(object arg1, object arg2, object arg3) {
T param1;
try { param1 = (T)arg1; } catch { param1 = default(T); }
return(action(param1));
});
}
public int On(string eventName, Action action) {
return Register(eventName, delegate(object arg1, object arg2, object arg3) {
T param1;
try { param1 = (T)arg1; } catch { param1 = default(T); }
action(param1);
return true;
});
}
public void Trigger(string eventName, object param1, object param2) {
Call(eventName, param1, param2, null);
}
public void Dispatch(string eventName, object param1, object param2) {
Dispatched d = (mFreeDispatch.Count == 0) ? new Dispatched() : mFreeDispatch.Pop();
mDispatched.Enqueue(d.Set(eventName, param1, param2));
}
public int On(string eventName, Func action) {
return Register(eventName, delegate(object arg1, object arg2, object arg3) {
T1 param1;
T2 param2;
try { param1 = (T1)arg1; } catch { param1 = default(T1); }
try { param2 = (T2)arg2; } catch { param2 = default(T2); }
return(action(param1, param2));
});
}
public int On(string eventName, Action action) {
return Register(eventName, delegate(object arg1, object arg2, object arg3) {
T1 param1;
T2 param2;
try { param1 = (T1)arg1; } catch { param1 = default(T1); }
try { param2 = (T2)arg2; } catch { param2 = default(T2); }
action(param1, param2);
return true;
});
}
public void Trigger(string eventName, object param1, object param2, object param3) {
Call(eventName, param1, param2, param3);
}
public void Dispatch(string eventName, object param1, object param2, object param3){
Dispatched d = (mFreeDispatch.Count == 0) ? new Dispatched() : mFreeDispatch.Pop();
mDispatched.Enqueue(d.Set(eventName, param1, param2, param3));
}
public int On(string eventName, Func action) {
return Register(eventName, delegate(object arg1, object arg2, object arg3) {
T1 param1;
T2 param2;
T3 param3;
try { param1 = (T1)arg1; } catch { param1 = default(T1); }
try { param2 = (T2)arg2; } catch { param2 = default(T2); }
try { param3 = (T3)arg3; } catch { param3 = default(T3); }
return(action(param1, param2, param3));
});
}
public int On(string eventName, Action action) {
return Register(eventName, delegate(object arg1, object arg2, object arg3) {
T1 param1;
T2 param2;
T3 param3;
try { param1 = (T1)arg1; } catch { param1 = default(T1); }
try { param2 = (T2)arg2; } catch { param2 = default(T2); }
try { param3 = (T3)arg3; } catch { param3 = default(T3); }
action(param1, param2, param3);
return true;
});
}
public bool Cancel(int listenerID) {
return mRegistered.Remove(listenerID);
}
public void DispatchPending() {
while(mDispatched.Count > 0) {
Dispatched d = mDispatched.Dequeue();
Call(d.mEventName, d.mArg1, d.mArg2, d.mArg3);
mFreeDispatch.Push(d);
}
}
int Register(string eventName, Func
action) { int listenID = ++mNextListenID; Listen listen = (mFreeListen.Count == 0) ? new Listen() : mFreeListen.Pop(); listen.mID = listenID; listen.mAction = action; mRegistered.Add(listenID, listen); ListeventList; if(!mRegisteredEvents.TryGetValue(eventName, out eventList)) eventList = mRegisteredEvents[eventName] = new List(); eventList.Add(listenID); return listenID; } void Call(string eventName, object arg1, object arg2, object arg3) { List listenerList; if(mRegisteredEvents.TryGetValue(eventName, out listenerList)) { for(int i = listenerList.Count - 1; i >= 0; --i) { Listen listener; if(mRegistered.TryGetValue(listenerList[i], out listener)) { if(!listener.mAction(arg1, arg2, arg3)) { mRegistered.Remove(listenerList[i]); mFreeListen.Push(listener); listenerList.RemoveAt(i); } } else { listenerList.RemoveAt(i); } } if(listenerList.Count == 0) { mRegisteredEvents.Remove(eventName); } } } class Listen { public int mID; public Func mAction; } class Dispatched { public Dispatched Set(string eventName, object arg1=null, object arg2=null, object arg3=null) { mEventName = eventName; mArg1 = arg1; mArg2 = arg2; mArg3 = arg3; return this; } public string mEventName; public object mArg1, mArg2, mArg3; } Dictionary<string,list> mRegisteredEvents = new Dictionary<string, list>(); Dictionary mRegistered = new Dictionary(); StackmFreeListen = new Stack(); Stack mFreeDispatch = new Stack(); Queue mDispatched = new Queue(); int mNextListenID = 4711; } } 接下来我会在最后一讲也就是设计六中,给大家说一下如何去使用。- U3D架构系列之- FSM有限状态机设计五
- U3d架构系列之-FSM有限状态机设计
- U3d架构系列之:FSM有限状态机设计一
- U3D架构系列之- FSM有限状态机设计二
- U3D架构系列之- FSM有限状态机设计三
- U3D架构系列之- FSM有限状态机设计四
- Unity3D架构系列之FSM有限状态机设计(五)
- Unity3D架构系列之- FSM有限状态机设计五
- U3D架构系列之- FSM有限状态机设计六(总结篇)
- Unity3D架构系列之-FSM有限状态机设计(一)
- Unity3D架构系列之- FSM有限状态机设计(二)
- Unity3D架构系列之- FSM有限状态机设计(三)
- Unity3D架构系列之- FSM有限状态机设计(四)
- [大洋] Unity3D架构系列之- FSM有限状态机设计一至四
- Unity3D架构系列之- FSM有限状态机设计四至六
- Unity3D架构系列之- FSM有限状态机设计一
- Unity3D架构系列之- FSM有限状态机设计二
- Unity3D架构系列之- FSM有限状态机设计三
- DAO设计模式
- LeetCode 125 Valid Palindrome(有效回文)(*)
- cocos2d-x学习笔记—图片按钮
- 爬虫之验证码问题
- U3D架构系列之- FSM有限状态机设计四
- U3D架构系列之- FSM有限状态机设计五
- U3D架构系列之- FSM有限状态机设计六(总结篇)
- cocos2dx3.0 C++开发 零基础入门笔记
- vimrc 中的配置代码
- 关于论文(英语)写作
- CALayer的基本使用
- 零基础学cocos2dx 3.0(顺带学C++)第一篇 切换场景
- 数学之路(机器学习实践指南)-文本挖掘与NLP(5)
- Java开发人员面试题目学习(极客学院)