Files
EVEngine/docs/usr/modules/event.md
T

50 lines
2.3 KiB
Markdown

# 事件模块
**脚本入口:** `eve.PlatformEvent()`
泵送平台事件,并用字符串消息队列在模块或线程之间传递通知。
## 基本用法
```squirrel
local events = eve.PlatformEvent();
events.pushData("quest-complete", "intro");
local name = events.poll();
if (name == "quest-complete") showReward();
```
## 对象关系与调用时机
`PlatformEvent` 承接 SDL 平台事件泵和简单字符串消息队列。平台输入由 `pump()` 收集;业务消息由 `pushData()` 写入并由 `poll()` / `pollData()` 取出。默认循环已泵送事件,游戏一般只消费队列。可重放的领域事件使用独立的 `GameEvent` 日志。
## 目标导向指南
### 在系统之间发送一次性消息
生产者使用 `pushData(name, data)` 写入事件;消费者在 `eve_update` 中循环 `poll()` 或 `pollData()`,并用 `getLastData()` 读取最近消息的关联字符串。事件消费后即从队列移除,适合“任务完成”“切换关卡”而不是持久状态。
### 保持窗口响应
自定义主循环时每帧调用 `pump()`;模块没有阻塞等待接口;无事件时继续下一帧。清空业务消息应由消费者持续 `poll()`,不要停住渲染线程。
## 常见问题
- 同一事件被多个系统竞争消费:指定唯一消费者,再转发领域状态。
- 把队列当状态存储:队列是一次性的;持久状态应放组件或游戏模型。
- 在渲染阶段消费事件:会造成帧内顺序不稳定,应在更新阶段完成。
## API 快查
下列方法名来自当前 Squirrel 绑定;同一模块创建的辅助对象(例如 `World`、`Body`、`Source`)的方法也列在这里。
- `getLastData()`、`getName()`、`poll()`、`pollData()`、`pump()`、`pushData()`
## 使用要点
- 模块对象和它创建的资源对象应保存在全局或实体状态中,不要在每帧重复创建。
- 带 `update(dt)` 的系统应在 `eve_update` 调用;绘制方法应在 `eve_render` 调用。
- 参数约束、默认值和返回类型以对应模块头文件及 `addFunc` 绑定为准;本文 API 快查与当前源码同步生成。
**源码:** [`src/modules/platform_event/`](../../../src/modules/platform_event/)
**相关测试:** 在 [`test/`](../../../test/) 中搜索 `event`。