事件监听器

事件类型

public enum BaseHEventType {
GAME_OVER,
GAME_WIN,
PAUSE,
ENERGY_EMEPTy,
GAME_DATA
}

事件基类

public class BaseHEvent
{
protected Hashtable m_arguments;
protected BaseHEventType m_type;
protected Object m_Sender; public IDictionary Params {
get { return this.m_arguments; }
set { this.m_arguments = (value as Hashtable); }
} public BaseHEventType Type {//事件类型 构造函数会给Type 和Sender赋值
get { return this.m_type; }
set { this.m_type = value; }
} public Object Sender {//物体
get { return this.m_Sender; }
set { this.m_Sender = value; }
} public override string ToString()
{
return this.m_type + "[" + ((this.m_Sender == null) ? "null" : this.m_Sender.ToString()) + "]";
} /// <summary>
/// 构造函数
/// </summary>
/// <param name="type"> 事件类型 </param>
/// <param name="sender"> 物体 </param>
public BaseHEvent(BaseHEventType type, Object sender)
{
this.Type = type;
Sender = sender;
if (this.m_arguments == null)
{
this.m_arguments = new Hashtable();
Debug.LogError("this.m_arguments" + this.m_arguments.Count);
}
} public BaseHEvent (BaseHEventType type,Hashtable args,Object sender)
{
this.Type = type;
this.m_arguments = args;
Sender = sender; if (this.m_arguments == null)
{
this.m_arguments = new Hashtable();
}
} public BaseHEvent Clone()
{
return new BaseHEvent(this.m_type, this.m_arguments, Sender);
}
}

事件机制

public delegate void HEventListenerDelegate(BaseHEvent hEvent);//定义委托用于传事件基类

public class HEventDispatcher
{
static HEventDispatcher Instance;
public static HEventDispatcher GetInstance()//单利
{
if (Instance == null)
{
Instance = new HEventDispatcher();
}
return Instance;
} private Hashtable listeners = new Hashtable(); //掌控所有类型的委托事件 public void AddEventListener(BaseHEventType type,HEventListenerDelegate listener)
{
HEventListenerDelegate hEventListenerDelegate = this.listeners[type] as HEventListenerDelegate;//获得之前这个类型的委托 如果第一次等于Null
hEventListenerDelegate = (HEventListenerDelegate) Delegate.Combine(hEventListenerDelegate, listener);//将两个委托的调用列表连接在一起,成为一个新的委托
this.listeners[type] = hEventListenerDelegate;//赋值给哈希表中的这个类型
} public void RemoveEventListener(BaseHEventType type, HEventListenerDelegate listener)
{
HEventListenerDelegate hEventListener = this.listeners[type] as HEventListenerDelegate;//获得之前这个类型的委托 如果第一次等于Null
if (hEventListener != null)
{
hEventListener =(HEventListenerDelegate)Delegate.Remove(hEventListener, listener);//从hEventListener的调用列表中移除listener
this.listeners[type] = hEventListener;//赋值给哈希表中的这个类型
}
} public void DispatchEvent(BaseHEvent baseH)
{
HEventListenerDelegate hEventListener = this.listeners[baseH.Type] as HEventListenerDelegate;
if (hEventListener != null)
{
try
{
hEventListener(baseH);//执行委托
}
catch (Exception e)
{
throw new System.Exception(string.Concat(new string[] { "Error Dispatch event", baseH.Type.ToString(), ":", e.Message, " ", e.StackTrace }), e);
}
}
} public void RemoveAll()
{
this.listeners.Clear();
} }

调用方法 下面是我在Unity当中调用的

    //注册/添加事件
void Start()
{
HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_DATA,StartHEvent);
HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_DATA, StartDataEvent);
HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_WIN,StopHEvent);
} //事件分发
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
HEventDispatcher.GetInstance().DispatchEvent(new BaseHEvent(BaseHEventType.GAME_DATA, this));
}
if (Input.GetKeyDown(KeyCode.S))
{
HEventDispatcher.GetInstance().DispatchEvent(new BaseHEvent(BaseHEventType.GAME_WIN, this));
}
}
//事件移除
private void OnDestroy()
{
HEventDispatcher.GetInstance().RemoveEventListener(BaseHEventType.GAME_DATA, StartHEvent);
HEventDispatcher.GetInstance().RemoveEventListener(BaseHEventType.GAME_WIN, StopHEvent);
} //添加事件方法
void StartDataEvent(BaseHEvent hEvent)
{
Debug.Log("Doule" +hEvent.ToString());
} void StartHEvent(BaseHEvent hEvent)
{
Debug.Log("StartHEvent + HEvent" + hEvent.ToString());
} void StopHEvent(BaseHEvent hEvent)
{
Debug.Log("StopHEvent + HEvent" + hEvent.ToString());
}

最新文章

  1. java代码实现栈
  2. 【XLL API 函数】xlSheetId
  3. outlook备份及恢复
  4. mysql安装及卸载
  5. animation of android (1)
  6. 浅谈javascript中的数据类型和引用类型
  7. mysql数据库表格导出为excel表格
  8. jsp页面写入中文到mysql时出现了乱码(转)
  9. Ubuntu设置环境变量的几种方法
  10. 超级实用且不花哨的js代码大全
  11. JENKINS 打包发布脚本
  12. java 遍历树节点 同时保留所有的从根到叶节点的路径
  13. Linux下一个C基本的编程----写进Blog在那之前
  14. 解决xtrabackup command not found no mysqld group 问题
  15. python3之模块
  16. c++趣味之难以发现的bug
  17. [转] List of OpenFlow Software Projects
  18. 草珊瑚的redux使用方式
  19. 2016 多校联赛7 Balls and Boxes(概率期望)
  20. hdu 5692(dfs+线段树) Snacks

热门文章

  1. Asp.net Core 系列之--2.ORM初探:Dapper实现MySql数据库各类操作
  2. SpringBoot Web篇笔记(一)
  3. 开源 ERP 系统 GoodERP
  4. Python 基础之 线程与进程
  5. 前后端分离,我怎么就选择了 Spring Boot + Vue 技术栈?
  6. 微信web协议,群成员唯一uin,获取群成员唯一标识
  7. pat 1069 The Black Hole of Numbers(20 分)
  8. python3.7.1安装Scrapy爬虫框架
  9. oracle使用parallel并行,多线程查询
  10. Git的使用和基本概念理解