EventManager 和 EventCallbackList 类解释文档

概述

该文档描述了 EventManagerEventCallbackList 类,它们共同构成了一个游戏事件的分级广播管理系统。该系统允许注册、注销和触发事件,每个事件可以有不同的优先级。

头文件

1
2
3
4
5
#include <vector>
#include <functional>
#include <unordered_map>
#include "GameEvent.h"
#include "Delegate.h"
  • <vector>: 用于存储回调列表。
  • <functional>: 提供了 std::function
  • <unordered_map>: 用于快速查找事件信息。
  • "GameEvent.h": 包含游戏事件基类定义。
  • "Delegate.h": 包含委托类定义。

常量定义

1
const int MAX_PRIORITY_COUNT = 11;
  • MAX_PRIORITY_COUNT: 定义了最大优先级数量,优先级从 0 到 10。

GameEventPriority 类

1
2
3
4
5
6
class GameEventPriority {
public:
const int Low = 0;
const int Middle = 5;
const int High = 10;
};
  • GameEventPriority: 定义了事件的优先级常量。

EventCallbackList 类

构造函数

1
EventCallbackList();
  • 初始化回调列表和缓存列表。

成员函数

Add()

1
void Add(Delegate<GameEventBase*>& action, int priority);
  • 向回调列表中添加一个委托,并指定其优先级。

Remove()

1
void Remove(Delegate<GameEventBase*>& delegate, int priority);
  • 从回调列表中移除指定的委托。

Invoke()

1
void Invoke(GameEventBase* evt);
  • 触发所有注册的回调,按照优先级从高到低调用。

私有成员

  • callbackLists: 存储回调列表。
  • cacheCallbackLists: 存储缓存列表。
  • cacheDirty: 标记缓存是否需要更新。
  • invokeCount: 记录当前正在触发的回调数量。

私有成员函数

GetCallbacks()

1
std::vector<Delegate<GameEventBase*>>* GetCallbacks();
  • 返回当前应该操作的回调列表,如果是触发阶段则返回缓存列表。

EventManager 类

静态成员

  • _events: 存储所有事件的回调列表。
  • _findEvents: 用于快速查找事件信息。

成员函数

Register()

1
2
template <typename T>
static void Register(Delegate<T*>& callback, int priority = 5);
  • 注册一个事件回调,并指定优先级。

Unregister()

1
2
template <typename T>
static void Unregister(Delegate<T*>& callback);
  • 注销一个事件回调。

SendEvent()

1
2
template<typename T>
static void SendEvent(T* evt);
  • 触发一个事件,调用所有注册的回调。

私有结构

EventInfo

1
2
3
4
5
struct EventInfo {
int eventId;
int priority;
Delegate<GameEventBase*> action;
};
  • 存储事件信息,包括事件ID、优先级和委托。

注意事项

  • 确保 GameEventDelegate 类已经正确实现。
  • 使用 EventManager 时,应检查回调的有效性。
  • 事件优先级应在有效范围内(0 到 10)。
  • 在事件触发期间,不应修改回调列表。