Skip to content

基础对话:AShell、ADialog 与 ALine

最简的故事只需要一个对话,里面有一行文字。让我们从一个“你好,世界!”开始。

xml
<AShell>
    <ADialog>
        <ALine>你好,世界!</ALine>
    </ADialog>
</AShell>

当你保存并运行这段代码时,ADVMaker 会自动:

  1. ADialog 分配一个唯一的 ID(如 __DIALOG&NUM1)。
  2. ALine 的内容打包为一个虚拟节点(VNode),放入对话的脚本数组中。
  3. 在全部组件挂载完成后,调用 Adv.appendDialog 将这个对话注册到游戏引擎。

你完全不需要手动管理 ID 或调用 API。随着故事增长,这种声明式写法会让你节省大量精力。

多行对话

ADialog 中可以放置任意数量的 ALine,它们会按照书写顺序依次呈现给玩家:

xml
<ADialog>
    <ALine>勇者推开了古老的大门。</ALine>
    <ALine>灰尘在阳光中飞舞,空气中弥漫着陈旧的味道。</ALine>
</ADialog>

延迟求值机制

ALine 采用延迟求值策略,会在 onMounted 中注册一个异步函数,等待游戏引擎执行到该行时才调用插槽函数(slots.default()),生成 VNode 并通过 Adv.print() 输出。

约束ALine 内部仅支持纯文本自定义 VNode(自包含的展示组件),不得嵌套 <A-*> 系列组件(如 ARunAIf 等)。这是因为延迟执行时 VNode 的渲染上下文已脱离原始组件树。

自动推断 next

最令人称道的一点是,你通常不需要手动指定对话之间的跳转。组件会根据它们在模板中的出现顺序,自动计算 next 属性。例如:

xml
<ADialog id="d1">
    <ALine>第一段</ALine>
</ADialog>
<ADialog id="d2">
    <ALine>第二段</ALine>
</ADialog>

这里 d1next 会自动设为 "d2",而 d2next 则为 null(表示故事暂时停顿)。你仍然可以手动指定 next 来覆盖这一行为,这会在后续小节详细介绍。

注意:所有故事组件都必须嵌套在 <AShell> 内部,否则它们无法正常工作。AShell 是整个故事的注册中心和调度器。