游戏开发过程中,消息系统是整个框架中比较重要的一部分,用得好可以使客户端框架“干净整洁”(私以为这个很重要),不然各种交叉访问,耦合度实在是不要太高啊!
分析:
- 需要一个全局的消息管理器,用于管理消息,可以添加,移除,清空,分发消息,这样一来,字典Dictionary< EventType, EventListenerDelegate>最合适不过了,当然也可以使用哈希表来做容器;
- EventType是事件类型,EventListenerDelegate是委托;
- EventListenerDelegate的参数是EventData;
/// <summary>
/// 消息类型定义
/// </summary>
public enum EventType{
GAME_START,
GAME_OVER,
PAUSE,
CLICK_CUBE,
}
using System.Collections;
/// <summary>
/// 基本事件封装
/// </summary>
public class EventData
{
protected Hashtable arguments;
private EventType type;
protected object sender;
public EventType Type
{
get { return type; }
set { type = value; }
}
public IDictionary Params
{
get { return arguments; }
set { arguments = (Hashtable) value; }
}
public object Sender
{
get { return sender; }
set { sender = value; }
}
public override string ToString()
{
return this.type + "[" + ((this.sender == null) ? "null" : this.sender.ToString() + "]");
}
public EventData Clone()
{
return new EventData(type,arguments,Sender);
}
public EventData(EventType type, object sender)
{
this.Type = type;
Sender = sender;
if (this.arguments == null)
{
this.arguments = new Hashtable();
}
}
public EventData(EventType type, Hashtable args, object sender)
{
this.Type = type;
this.arguments = args;
Sender = sender;
if (this.arguments == null)
{
this.arguments=new Hashtable();
}
}
}
using System;
using System.Collections.Generic;
public delegate void EventListenerDelegate(EventData evt);
public class MessageManager
{
static MessageManager instance;
public static MessageManager GetInstance()
{
if (instance == null)
{
instance = new MessageManager();
}
return instance;
}
//private Hashtable listeners = new Hashtable();
private Dictionary<EventType, EventListenerDelegate> listeners = new Dictionary<EventType, EventListenerDelegate>();
/// <summary>
/// 增加监听
/// </summary>
/// <param name="eventType"></param>
/// <param name="listener"></param>
public void AddEventListener(EventType eventType, EventListenerDelegate listener)
{
EventListenerDelegate eventListenerDelegate = null;
if (!listeners.TryGetValue(eventType, out eventListenerDelegate))
{
listeners.Add(eventType, listener);
}
}
/// <summary>
/// 移除事件
/// </summary>
/// <param name="eventType"></param>
/// <param name="listener"></param>
public void RemoveEventListener(EventType eventType, EventListenerDelegate listener)
{
EventListenerDelegate eventListenerDelegate = null;
if (listeners.TryGetValue(eventType, out eventListenerDelegate))
{
listeners.Remove(eventType);
}
}
/// <summary>
/// 分发消息
/// </summary>
/// <param name="evt"></param>
public void Dispatcher(EventData evt)
{
EventListenerDelegate eventListenerDelegate = null;
if (listeners.TryGetValue(evt.Type, out eventListenerDelegate))
{
try
{
eventListenerDelegate(evt);
}
catch (Exception e)
{
throw new Exception(string.Concat(new string[]
{
"Error dispatcher event",
evt.Type.ToString(),
":",
e.Message,
" ",
e.StackTrace
}), e);
}
}
}
public void RemoveAll()
{
listeners.Clear();
}
}
源代码:
https://gitee.com/xianglinlove/EventManager
点击白色小球,正方体开始运动;