Order interactives inside their layer instead of a global z index; mod documentation
This commit is contained in:
1 parent
8a7a1295ca
commit
3e22a98c08
19 files changed
+650
-9
No files matched your search
+88
@@ -0,0 +1,88 @@
|
||||
# Interactive Base — 场景中可点击的对象
|
||||
|
||||
Interactive Base 为图像场景加入可点击的对象:地上的东西、一扇门、"墓穴后面"的某个位置。对象可以有一张叠在背景之上的图片,鼠标悬停时可以发光,点击则启动一段剧本。剧本会随着故事推进添加和移除对象。
|
||||
|
||||
Cthangover 的序章使用了它。RPG World 的图块地图则使用自己的事件。
|
||||
|
||||
## 在游戏中
|
||||
|
||||
Cthangover 开场时,小巷的自行车旁放着一块红布。它不是背景的一部分,而是一个带有独立图片的交互物。
|
||||
|
||||

|
||||
|
||||
当鼠标移到红布上时,指针变成手形,红布泛起一层淡淡的金色:
|
||||
|
||||

|
||||
|
||||
点击后启动红布的剧本:Marao 把它捡起来,剧本随即将这个对象从场景中移除。
|
||||
|
||||

|
||||
|
||||
## 交互对象
|
||||
|
||||
对象是 mod 的 `interactives/` 文件夹里的 JSON 文件。下面就是截图中的红布(来自 Cthangover),轮廓顶点做了精简:
|
||||
|
||||
```json
|
||||
{
|
||||
"Items": [
|
||||
{
|
||||
"id": "cloak_ground",
|
||||
"texture": "cloak_ground",
|
||||
"layer": "foreground",
|
||||
"zIndex": 5,
|
||||
"cursor": "PointingHand",
|
||||
"hitArea": {
|
||||
"type": "polygon",
|
||||
"vertices": [
|
||||
{ "x": 0.2796, "y": 0.7318 }, { "x": 0.3207, "y": 0.7167 },
|
||||
{ "x": 0.3456, "y": 0.8434 }, { "x": 0.3387, "y": 0.8872 }
|
||||
]
|
||||
},
|
||||
"highlight": { "color": "#FFD70044", "scale": 1, "duration": 0.12 },
|
||||
"actions": {
|
||||
"onClick": { "scenario": "scenarios/prolog/morning_cloak.scenario" }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
- `texture` — 一张覆盖整个屏幕的图片,除对象本身外全部透明,因此能自动与背景对齐。想要看不见的点击区就省略它。
|
||||
- `hitArea` — 对象可以被点击的范围,以屏幕比例(0–1)表示:`rect` 用 `x`、`y`、`width`、`height`;`circle` 用 `x`、`y`、`radius`;或 `polygon` 用 `vertices`。
|
||||
- `layer` — `background` 或 `foreground`;两者都属于画面本身,位于对话框、工具栏和各面板之下。`ui` 则画在一切之上。
|
||||
- `zIndex` — 同一图层内对象之间的先后顺序:数值越大越靠上绘制。
|
||||
- `cursor` — 鼠标悬停在对象上时的指针样式,例如 `PointingHand`。
|
||||
- `highlight` — 鼠标悬停时的染色效果:`color`(带透明度)、`scale`,以及淡入时长 `duration`(秒)。
|
||||
- `enabled`、`visible` — 对象是否响应点击,以及最初是否绘制。
|
||||
- `actions` — `onClick` 运行一个 `scenario` 文件或内联的 `commands`;`onHoverEnter` 和 `onHoverLeave` 执行剧本命令。
|
||||
|
||||
## 把对象放进场景
|
||||
|
||||
仅有定义不会出现在任何地方。场景的剧本负责添加它,而点击触发的剧本通常会移除它:
|
||||
|
||||
```scenario
|
||||
interactive_add cloak_ground
|
||||
interactive_remove cloak_ground
|
||||
```
|
||||
|
||||
切换场景时对象会被清空,因此 Cthangover 每次进入都用一段会检查剧情的场景剧本来重新添加它们:
|
||||
|
||||
```scenario
|
||||
scene: prolog_alley
|
||||
priority: 15
|
||||
condition: AwakeningQuest.notHasTag("cloak_taken") && AwakeningQuest.notHasTag("book_taken")
|
||||
---
|
||||
interactive_add cloak_ground
|
||||
interactive_add book_ground
|
||||
end
|
||||
```
|
||||
|
||||
添加已存在的对象不会有任何效果,所以重复执行是安全的。
|
||||
|
||||
也可以在 Editor Tools 的交互编辑器里摆放对象并绘制点击区域。
|
||||
|
||||
## 出问题时
|
||||
|
||||
1. **点击没有反应。** 对象从未在这个场景里添加过、`enabled` 未开启,或点击落在 `hitArea` 之外。
|
||||
2. **图片位置不对。** 贴图必须是与背景对齐的全屏图片,而不是一小块裁剪图。
|
||||
3. **对象被拿走后又出现了。** 添加它的剧本必须检查与点击剧本所设置的相同标签或标记。
|
||||
Reference in new issue
Block a user