docs(10-17): 核对源码并收口钩子文档

This commit is contained in:
unanmed 2026-10-20 13:08:03 +08:00
parent e074c73433
commit 5109d32515

View File

@ -24,17 +24,17 @@
先看几种容易出错的组合:
| 场景 | 实际存在的对象 |
| ------------------------------------ | --------------------------------------------------- |
| 一张地图有多个图层 | 每个图层一个 `MapLayer`,各自独立 |
| 楼层集合里有多张地图 | 每张地图一个 `IGameMap`,各自独立 |
| 场上有多个动态图块 | 每个动态图块一个 `IDynamicTile`,各自带一个 `mover` |
| 勇士与动态图块同时存在 | 勇士的移动器与图块的移动器是不同实例 |
| 同一张地图被重复打开或存在于多个沙盒 | 可能是多个 `IGameMap` 实例,名字相同但引用不同 |
| 场景 | 实际存在的对象 |
| ---------------------- | --------------------------------------------------- |
| 一张地图有多个图层 | 每个图层一个 `MapLayer`,各自独立 |
| 楼层集合里有多张地图 | 每张地图一个 `IGameMap`,各自独立 |
| 场上有多个动态图块 | 每个动态图块一个 `IDynamicTile`,各自带一个 `mover` |
| 勇士与动态图块同时存在 | 勇士的移动器与图块的移动器是不同实例 |
| 同一楼层 id 被重新创建 | 旧引用与新引用是两个 `IGameMap`,名字相同但引用不同 |
钩子被触发,只能说明「它所属的实例发生了事件」,不能说明那就是你想要的那个实例。比如地图级钩子的 `onResizeLayer(layer, width, height)` 会收到该地图每个图层的尺寸变化;如果你不比较 `layer`,就会对每个图层都执行一次。
地图与图层之间还有一层内部转发:`GameMap.addLayer` 会为每个图层注册一个 `StateMapLayerHook`,把图层的 `onResize` 转发到地图的 `onResizeLayer`,并带上具体 `layer`。所以地图级钩子能拿到图层身份;图层级钩子反而拿不到「我是谁」,因为图层钩子的回调参数里没有 layer。
地图与图层之间还有一层内部转发:`GameMap.addLayer` 会为每个图层注册一个 `StateMapLayerHook`,把图层的 `onResize` 转发到地图的 `onResizeLayer`,并带上具体 `layer`。所以地图级钩子能拿到图层身份;图层级钩子的大多数回调参数里没有 layer,只有动态图块方法能通过 `tile.layer` 间接拿到。
## 身份从哪里来
@ -244,7 +244,7 @@ layer.addHook(hook);
## 异步钩子
钩子分同步与异步两类。同步钩子在触发时立即执行;异步钩子返回 `Promise`,引擎会把本次触发的返回值收集起来,用 `Promise.all` 并发等待。
钩子分同步与异步两类。同步钩子在触发时立即执行;异步钩子返回 `Promise`。在本篇列出的异步钩子族里,引擎会把本次触发的返回值收集起来,用 `Promise.all` 并发等待。
本篇核对过的异步钩子族: