基础对话:AShell、ADialog 与 ALine
最简的故事只需要一个对话,里面有一行文字。让我们从一个“你好,世界!”开始。
xml
<AShell>
<ADialog>
<ALine>你好,世界!</ALine>
</ADialog>
</AShell>当你保存并运行这段代码时,ADVMaker 会自动:
- 为
ADialog分配一个唯一的 ID(如__DIALOG&NUM1)。 - 将
ALine的内容打包为一个虚拟节点(VNode),放入对话的脚本数组中。 - 在全部组件挂载完成后,调用
Adv.appendDialog将这个对话注册到游戏引擎。
你完全不需要手动管理 ID 或调用 API。随着故事增长,这种声明式写法会让你节省大量精力。
多行对话
ADialog 中可以放置任意数量的 ALine,它们会按照书写顺序依次呈现给玩家:
xml
<ADialog>
<ALine>勇者推开了古老的大门。</ALine>
<ALine>灰尘在阳光中飞舞,空气中弥漫着陈旧的味道。</ALine>
</ADialog>延迟求值机制
ALine 采用延迟求值策略,会在 onMounted 中注册一个异步函数,等待游戏引擎执行到该行时才调用插槽函数(slots.default()),生成 VNode 并通过 Adv.print() 输出。
约束:
ALine内部仅支持纯文本和自定义 VNode(自包含的展示组件),不得嵌套<A-*>系列组件(如ARun、AIf等)。这是因为延迟执行时 VNode 的渲染上下文已脱离原始组件树。
自动推断 next
最令人称道的一点是,你通常不需要手动指定对话之间的跳转。组件会根据它们在模板中的出现顺序,自动计算 next 属性。例如:
xml
<ADialog id="d1">
<ALine>第一段</ALine>
</ADialog>
<ADialog id="d2">
<ALine>第二段</ALine>
</ADialog>这里 d1 的 next 会自动设为 "d2",而 d2 的 next 则为 null(表示故事暂时停顿)。你仍然可以手动指定 next 来覆盖这一行为,这会在后续小节详细介绍。
注意:所有故事组件都必须嵌套在
<AShell>内部,否则它们无法正常工作。AShell是整个故事的注册中心和调度器。