3.9 KiB
3.9 KiB
Interactive Base — 场景中可点击的对象
Interactive Base 为图像场景加入可点击的对象:地上的东西、一扇门、"墓穴后面"的某个位置。对象可以有一张叠在背景之上的图片,鼠标悬停时可以发光,点击则启动一段剧本。剧本会随着故事推进添加和移除对象。
Cthangover 的序章使用了它。RPG World 的图块地图则使用自己的事件。
在游戏中
Cthangover 开场时,小巷的自行车旁放着一块红布。它不是背景的一部分,而是一个带有独立图片的交互物。
当鼠标移到红布上时,指针变成手形,红布泛起一层淡淡的金色:
点击后启动红布的剧本:Marao 把它捡起来,剧本随即将这个对象从场景中移除。
交互对象
对象是 mod 的 interactives/ 文件夹里的 JSON 文件。下面就是截图中的红布(来自 Cthangover),轮廓顶点做了精简:
{
"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执行剧本命令。
把对象放进场景
仅有定义不会出现在任何地方。场景的剧本负责添加它,而点击触发的剧本通常会移除它:
interactive_add cloak_ground
interactive_remove cloak_ground
切换场景时对象会被清空,因此 Cthangover 每次进入都用一段会检查剧情的场景剧本来重新添加它们:
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 的交互编辑器里摆放对象并绘制点击区域。
出问题时
- 点击没有反应。 对象从未在这个场景里添加过、
enabled未开启,或点击落在hitArea之外。 - 图片位置不对。 贴图必须是与背景对齐的全屏图片,而不是一小块裁剪图。
- 对象被拿走后又出现了。 添加它的剧本必须检查与点击剧本所设置的相同标签或标记。


