mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-14 16:51:28 +00:00
GameEvent
GameEvent
This commit is contained in:
@@ -9,15 +9,19 @@ namespace TEngine
|
|||||||
class EventDelegateData
|
class EventDelegateData
|
||||||
{
|
{
|
||||||
private int m_eventType = 0;
|
private int m_eventType = 0;
|
||||||
public List<Delegate> m_listExist = new List<Delegate>();
|
private List<Delegate> m_listExist = new List<Delegate>();
|
||||||
private List<Delegate> m_addList = new List<Delegate>();
|
private List<Delegate> m_addList = new List<Delegate>();
|
||||||
private List<Delegate> m_deleteList = new List<Delegate>();
|
private List<Delegate> m_deleteList = new List<Delegate>();
|
||||||
private bool m_isExcute = false;
|
private bool m_isExcute = false;
|
||||||
private bool m_dirty = false;
|
private bool m_dirty = false;
|
||||||
|
|
||||||
public EventDelegateData(int evnetType)
|
/// <summary>
|
||||||
|
/// 构造函数。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="eventType"></param>
|
||||||
|
public EventDelegateData(int eventType)
|
||||||
{
|
{
|
||||||
m_eventType = evnetType;
|
m_eventType = eventType;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -232,9 +236,12 @@ namespace TEngine
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 封装消息的底层分发和注册。
|
/// 封装消息的底层分发和注册。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
class EventDispatcher
|
public class EventDispatcher
|
||||||
{
|
{
|
||||||
static Dictionary<int, EventDelegateData> m_eventTable = new Dictionary<int, EventDelegateData>();
|
/// <summary>
|
||||||
|
/// 事件Table
|
||||||
|
/// </summary>
|
||||||
|
private static Dictionary<int, EventDelegateData> s_eventTable = new Dictionary<int, EventDelegateData>();
|
||||||
|
|
||||||
#region 事件管理接口
|
#region 事件管理接口
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -245,10 +252,10 @@ namespace TEngine
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public bool AddEventListener(int eventType, Delegate handler)
|
public bool AddEventListener(int eventType, Delegate handler)
|
||||||
{
|
{
|
||||||
if (!m_eventTable.TryGetValue(eventType, out var data))
|
if (!s_eventTable.TryGetValue(eventType, out var data))
|
||||||
{
|
{
|
||||||
data = new EventDelegateData(eventType);
|
data = new EventDelegateData(eventType);
|
||||||
m_eventTable.Add(eventType, data);
|
s_eventTable.Add(eventType, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
return data.AddHandler(handler);
|
return data.AddHandler(handler);
|
||||||
@@ -261,7 +268,7 @@ namespace TEngine
|
|||||||
/// <param name="handler"></param>
|
/// <param name="handler"></param>
|
||||||
public void RemoveEventListener(int eventType, Delegate handler)
|
public void RemoveEventListener(int eventType, Delegate handler)
|
||||||
{
|
{
|
||||||
if (m_eventTable.TryGetValue(eventType, out var data))
|
if (s_eventTable.TryGetValue(eventType, out var data))
|
||||||
{
|
{
|
||||||
data.RmvHandler(handler);
|
data.RmvHandler(handler);
|
||||||
}
|
}
|
||||||
@@ -275,7 +282,7 @@ namespace TEngine
|
|||||||
/// <param name="eventType">事件类型。</param>
|
/// <param name="eventType">事件类型。</param>
|
||||||
public void Send(int eventType)
|
public void Send(int eventType)
|
||||||
{
|
{
|
||||||
if (m_eventTable.TryGetValue(eventType, out var d))
|
if (s_eventTable.TryGetValue(eventType, out var d))
|
||||||
{
|
{
|
||||||
d.Callback();
|
d.Callback();
|
||||||
}
|
}
|
||||||
@@ -289,7 +296,7 @@ namespace TEngine
|
|||||||
/// <typeparam name="TArg1"></typeparam>
|
/// <typeparam name="TArg1"></typeparam>
|
||||||
public void Send<TArg1>(int eventType, TArg1 arg1)
|
public void Send<TArg1>(int eventType, TArg1 arg1)
|
||||||
{
|
{
|
||||||
if (m_eventTable.TryGetValue(eventType, out var d))
|
if (s_eventTable.TryGetValue(eventType, out var d))
|
||||||
{
|
{
|
||||||
d.Callback(arg1);
|
d.Callback(arg1);
|
||||||
}
|
}
|
||||||
@@ -305,7 +312,7 @@ namespace TEngine
|
|||||||
/// <typeparam name="TArg2"></typeparam>
|
/// <typeparam name="TArg2"></typeparam>
|
||||||
public void Send<TArg1, TArg2>(int eventType, TArg1 arg1, TArg2 arg2)
|
public void Send<TArg1, TArg2>(int eventType, TArg1 arg1, TArg2 arg2)
|
||||||
{
|
{
|
||||||
if (m_eventTable.TryGetValue(eventType, out var d))
|
if (s_eventTable.TryGetValue(eventType, out var d))
|
||||||
{
|
{
|
||||||
d.Callback(arg1, arg2);
|
d.Callback(arg1, arg2);
|
||||||
}
|
}
|
||||||
@@ -323,7 +330,7 @@ namespace TEngine
|
|||||||
/// <typeparam name="TArg3"></typeparam>
|
/// <typeparam name="TArg3"></typeparam>
|
||||||
public void Send<TArg1, TArg2, TArg3>(int eventType, TArg1 arg1, TArg2 arg2, TArg3 arg3)
|
public void Send<TArg1, TArg2, TArg3>(int eventType, TArg1 arg1, TArg2 arg2, TArg3 arg3)
|
||||||
{
|
{
|
||||||
if (m_eventTable.TryGetValue(eventType, out var d))
|
if (s_eventTable.TryGetValue(eventType, out var d))
|
||||||
{
|
{
|
||||||
d.Callback(arg1, arg2, arg3);
|
d.Callback(arg1, arg2, arg3);
|
||||||
}
|
}
|
||||||
@@ -343,7 +350,7 @@ namespace TEngine
|
|||||||
/// <typeparam name="TArg4"></typeparam>
|
/// <typeparam name="TArg4"></typeparam>
|
||||||
public void Send<TArg1, TArg2, TArg3, TArg4>(int eventType, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4)
|
public void Send<TArg1, TArg2, TArg3, TArg4>(int eventType, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4)
|
||||||
{
|
{
|
||||||
if (m_eventTable.TryGetValue(eventType, out var d))
|
if (s_eventTable.TryGetValue(eventType, out var d))
|
||||||
{
|
{
|
||||||
d.Callback(arg1, arg2, arg3, arg4);
|
d.Callback(arg1, arg2, arg3, arg4);
|
||||||
}
|
}
|
||||||
@@ -365,7 +372,7 @@ namespace TEngine
|
|||||||
/// <typeparam name="TArg5"></typeparam>
|
/// <typeparam name="TArg5"></typeparam>
|
||||||
public void Send<TArg1, TArg2, TArg3, TArg4, TArg5>(int eventType, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5)
|
public void Send<TArg1, TArg2, TArg3, TArg4, TArg5>(int eventType, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5)
|
||||||
{
|
{
|
||||||
if (m_eventTable.TryGetValue(eventType, out var d))
|
if (s_eventTable.TryGetValue(eventType, out var d))
|
||||||
{
|
{
|
||||||
d.Callback(arg1, arg2, arg3, arg4, arg5);
|
d.Callback(arg1, arg2, arg3, arg4, arg5);
|
||||||
}
|
}
|
||||||
|
@@ -2,49 +2,58 @@
|
|||||||
|
|
||||||
namespace TEngine
|
namespace TEngine
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 事件实体数据。
|
||||||
|
/// </summary>
|
||||||
internal class EventEntryData
|
internal class EventEntryData
|
||||||
{
|
{
|
||||||
public object InterfaceWrap;
|
public object InterfaceWrap;
|
||||||
};
|
};
|
||||||
|
|
||||||
class EventMgr
|
/// <summary>
|
||||||
|
/// 事件管理器。
|
||||||
|
/// </summary>
|
||||||
|
public class EventMgr
|
||||||
{
|
{
|
||||||
private EventDispatcher m_dispatcher = new EventDispatcher();
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 封装了调用的代理函数
|
/// 封装了调用的代理函数
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private Dictionary<string, EventEntryData> m_entry = new Dictionary<string, EventEntryData>();
|
private Dictionary<string, EventEntryData> m_entry = new Dictionary<string, EventEntryData>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 事件管理器获取接口。
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">接口类型。</typeparam>
|
||||||
|
/// <returns>接口实例。</returns>
|
||||||
public T GetInterface<T>()
|
public T GetInterface<T>()
|
||||||
{
|
{
|
||||||
string typeName = typeof(T).FullName;
|
string typeName = typeof(T).FullName;
|
||||||
EventEntryData entry;
|
if (typeName != null && m_entry.TryGetValue(typeName, out var entry))
|
||||||
if (m_entry.TryGetValue(typeName, out entry))
|
|
||||||
{
|
{
|
||||||
return (T)entry.InterfaceWrap;
|
return (T)entry.InterfaceWrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
return default(T);
|
return default(T);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 注册wrap的函数。
|
/// 注册wrap的函数。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T"></typeparam>
|
/// <typeparam name="T">Wrap接口类型。</typeparam>
|
||||||
/// <param name="callerWrap"></param>
|
/// <param name="callerWrap">callerWrap接口名字。</param>
|
||||||
public void RegWrapInterface<T>(T callerWrap)
|
public void RegWrapInterface<T>(T callerWrap)
|
||||||
{
|
{
|
||||||
string typeName = typeof(T).FullName;
|
string typeName = typeof(T).FullName;
|
||||||
|
|
||||||
var entry = new EventEntryData();
|
var entry = new EventEntryData();
|
||||||
entry.InterfaceWrap = callerWrap;
|
entry.InterfaceWrap = callerWrap;
|
||||||
m_entry.Add(typeName, entry);
|
if (typeName != null)
|
||||||
|
{
|
||||||
|
m_entry.Add(typeName, entry);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 分发注册器。
|
/// 分发注册器。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public EventDispatcher Dispatcher => m_dispatcher;
|
public EventDispatcher Dispatcher { get; } = new EventDispatcher();
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -7,15 +7,18 @@ namespace TEngine
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class GameEvent
|
public static class GameEvent
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 全局事件管理器。
|
||||||
|
/// </summary>
|
||||||
private static readonly EventMgr EventMgr = new EventMgr();
|
private static readonly EventMgr EventMgr = new EventMgr();
|
||||||
|
|
||||||
public static void Init()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#region 细分的注册接口
|
#region 细分的注册接口
|
||||||
|
/// <summary>
|
||||||
|
/// 增加事件监听。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="eventType">事件类型。</param>
|
||||||
|
/// <param name="handler">事件Handler。</param>
|
||||||
|
/// <returns>是否监听成功。</returns>
|
||||||
public static bool AddEventListener(int eventType, Action handler)
|
public static bool AddEventListener(int eventType, Action handler)
|
||||||
{
|
{
|
||||||
return EventMgr.Dispatcher.AddEventListener(eventType, handler);
|
return EventMgr.Dispatcher.AddEventListener(eventType, handler);
|
||||||
|
@@ -84,5 +84,13 @@ namespace TEngine
|
|||||||
AddEvent(eventType, handler);
|
AddEvent(eventType, handler);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void AddUIEvent<T, U, V, W, X>(int eventType, Action<T, U, V, W, X> handler)
|
||||||
|
{
|
||||||
|
if (GameEvent.AddEventListener(eventType, handler))
|
||||||
|
{
|
||||||
|
AddEvent(eventType, handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -2,29 +2,51 @@
|
|||||||
|
|
||||||
namespace TEngine
|
namespace TEngine
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 运行时字符串ID。
|
||||||
|
/// </summary>
|
||||||
public static class StringId
|
public static class StringId
|
||||||
{
|
{
|
||||||
private static readonly Dictionary<string, int> eventTypeHashMap = new Dictionary<string, int>();
|
/// <summary>
|
||||||
private static readonly Dictionary<int, string> eventHashToStringMap = new Dictionary<int, string>();
|
/// Key->字符串 | Value->Id (Table)
|
||||||
|
/// </summary>
|
||||||
|
private static readonly Dictionary<string, int> EventTypeHashMap = new Dictionary<string, int>();
|
||||||
|
/// <summary>
|
||||||
|
/// Key->Id | Value->字符串 (Table)
|
||||||
|
/// </summary>
|
||||||
|
private static readonly Dictionary<int, string> EventHashToStringMap = new Dictionary<int, string>();
|
||||||
|
/// <summary>
|
||||||
|
/// 当前Id。
|
||||||
|
/// </summary>
|
||||||
private static int _currentId = 0;
|
private static int _currentId = 0;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 字符串转HashId。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="val">字符串Value。</param>
|
||||||
|
/// <returns>HashId。</returns>
|
||||||
public static int StringToHash(string val)
|
public static int StringToHash(string val)
|
||||||
{
|
{
|
||||||
if (eventTypeHashMap.TryGetValue(val, out var hashId))
|
if (EventTypeHashMap.TryGetValue(val, out var hashId))
|
||||||
{
|
{
|
||||||
return hashId;
|
return hashId;
|
||||||
}
|
}
|
||||||
|
|
||||||
hashId = ++_currentId;
|
hashId = ++_currentId;
|
||||||
eventTypeHashMap[val] = hashId;
|
EventTypeHashMap[val] = hashId;
|
||||||
eventHashToStringMap[hashId] = val;
|
EventHashToStringMap[hashId] = val;
|
||||||
|
|
||||||
return hashId;
|
return hashId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// HashId转字符串。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="hash">HashId。</param>
|
||||||
|
/// <returns>字符串。</returns>
|
||||||
public static string HashToString(int hash)
|
public static string HashToString(int hash)
|
||||||
{
|
{
|
||||||
if (eventHashToStringMap.TryGetValue(hash, out var value))
|
if (EventHashToStringMap.TryGetValue(hash, out var value))
|
||||||
{
|
{
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
@@ -38,10 +38,6 @@ namespace TEngine
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Start()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 检查是否存在对象池。
|
/// 检查是否存在对象池。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
Reference in New Issue
Block a user