C++ 事件系统使用手册

概述

本手册提供了 C++ 事件系统的使用指南。事件系统允许对象订阅和接收特定类型的事件通知,从而实现对象之间的解耦。本系统基于 EventManager模块、GameEvent模块 Delegate 模块,支持使用 lambda 表达式来封装事件处理函数。

环境配置

在使用事件系统之前,请确保以下依赖库已正确配置:

  • EventManager.h: 事件管理器头文件,包含事件注册、发送和注销等功能。
  • iostream: 输入输出流库,用于示例中的打印操作。

基本概念

  • 事件 (Event): 代表发生的事情,可以被订阅和触发。
  • 委托 (Delegate): 用于封装事件处理函数,可以是 lambda 表达式、函数指针或函数对象。

使用步骤

1. 定义事件处理函数

事件处理函数应该接受一个事件对象作为参数,并执行相应的操作。

1
2
3
4
void Func(MyEvent* a)
{
std::cout << "TEST1" << a->message << std::endl;
}

2. 创建委托并注册事件

使用 lambda 表达式创建委托,并将其注册到事件管理器。

1
2
3
4
5
TEST1()
{
d = [this](MyEvent* a) {this->Func(a); };
EventManager::Register<MyEvent>(d);
}

3. 触发事件

创建事件对象,设置必要的信息,并通过事件管理器发送。

1
2
3
4
5
6
void Trigger()
{
auto evt = MyEvent::Get();
evt->message = "世界";
EventManager::SendEvent(evt);
}

4. 注销事件

当不再需要监听事件时,应注销委托。

1
2
3
4
void Remove()
{
EventManager::Unregister<MyEvent>(d);
}

5. 事件对象池管理

事件对象使用完毕后,应放回对象池以便重用。

1
evt->Dispose();

示例

以下是一个完整的示例,展示了如何使用事件系统。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class TEST
{
public:
void Func()
{
TEST2 t2;
TEST1 t1;
TEST3 t3;

t1.Trigger(); // 触发事件

t3.Remove(); // 注销事件

t1.Trigger(); // 再次触发事件

// 使用委托
Delegate<TEST1Event*> d;
d = [](TEST1Event* event) {Func1(event); };
EventManager::Register<TEST1Event>(d);

// 注册多个事件处理函数
Delegate<TEST1Event*> d1;
d1 = [](TEST1Event* event) {Func2(event); };
EventManager::Register<TEST1Event>(d1);

auto d2 = d1;
d2 = [](TEST1Event* event) {Func3(event); };
EventManager::Register<TEST1Event>(d2);

// 事件的使用
auto evt = TEST1Event::Get();
EventManager::Unregister<TEST1Event>(d2); // 注销事件
EventManager::SendEvent(evt); // 发送事件
evt->Dispose(); // 事件对象放回对象池
}
};

注意事项

  • 确保事件处理函数的参数类型与事件类型匹配。
  • 在注册委托之前,请检查事件处理函数的有效性。
  • 委托Delegate的模板参数是目标方法需求的参数类型,事件系统EventManger的模板参数是注册的事件类型

各模块解释

游戏事件池实现解释文档 | mao的博客 (mao1mao2mao3mao4.github.io)

EventManager 和 EventCallbackList 类解释文档 | mao的博客 (mao1mao2mao3mao4.github.io)

Delegate 类模板解释文档 | mao的博客 (mao1mao2mao3mao4.github.io)

结语

本手册提供了 C++ 事件系统的基础使用指南。通过遵循上述步骤,开发者可以有效地在应用程序中实现事件驱动的设计模式。