高级技巧
手动指定 next
虽然自动推断已经覆盖了绝大多数场景,你仍然可以通过 next 属性精确控制跳转。该属性在 AScene 和 ADialog 上均可用,且优先级高于自动推断。
<ADialog id="d1" next="secret_room">
<ALine>你发现了一扇隐藏的门。</ALine>
</ADialog>
<ADialog id="d2">
<ALine>你继续沿着走廊前进。</ALine>
</ADialog>
<ADialog id="secret_room">
<ALine>这是你从未见过的密室。</ALine>
</ADialog>这里 d1 显式指定了 next 为 "secret_room",跳过了紧接着的 d2。这种混合使用让你可以在需要时灵活跳转,而在大部分地方享受自动编排的便利。
传递 null 终止跳转
如果你希望某个对话或场景之后不再自动进入下一个,可以将 next 显式设为 null:
<ADialog id="open_end" :next="null">
<ALine>故事在这里暂告一段落……</ALine>
</ADialog>每次写 :next="null" 还是有些繁琐。AScene、ADialog 和 AOption 都支持一个 stop 布尔属性,设上就等同于 :next="null",而且写法更简洁:
<AScene id="scene1" name="起点">
<ADialog stop>
<ALine>暂停在这里,无需写 :next="null"</ALine>
</ADialog>
<ADialog>
<ALine>这个对话没有 stop,会自动流转到下一个。</ALine>
</ADialog>
</AScene>stop 的优先级高于 next,即使同时写了 next 也会被覆盖为 null:
<ADialog id="d1" next="d2" stop>
<!-- stop 覆盖了 next,故事仍会暂停 -->
<ALine>虽然写了 next,但 stop 让它暂停。</ALine>
</ADialog>全局关闭自动推断
如果你发现大多数场景和对话都需要手动指定 next,每次都写 :next="null" 很繁琐,可以在 <AShell> 上设置 auto-next 属性来全局关闭自动推断:
<AShell :auto-next="false">
<!-- 所有 AScene 和 ADialog 的 next 默认都为 null,需手动指定 -->
<AScene id="start" name="起点">
<ADialog id="d1">
<ALine>这段对话结束后,故事会暂停。</ALine>
</ADialog>
<ADialog id="d2" next="d3">
<ALine>我显式指定了 next。</ALine>
</ADialog>
<ADialog id="d3">
<ALine>即使只有一个对话,也不会自动跳转。</ALine>
</ADialog>
</AScene>
</AShell>auto-next 默认为 true(自动推断)。设为 false 后,所有 AScene 和 ADialog 的 next 都会默认为 null,除非你手动指定了 next 属性。对于以手动编排为主的复杂故事,这可以避免大量冗余的 :next="null" 写法。
嵌套与组合
故事组件可以自由嵌套,只要遵循正确的父子关系。例如,你可以在一个 ADialog 中同时包含普通 ALine 和 AOptions,它们会按照书写顺序呈现:
<ADialog>
<ALine>你遇到了一个商人。</ALine>
<ALine>他向你展示了两件商品。</ALine>
<AOptions>
<AOption>...</AOption>
<AOption>...</AOption>
</AOptions>
<ALine>商人微笑着收起了货物。</ALine>
</ADialog>需要注意的是,选项列表被视为一个整体内容项。玩家必须先做出选择(并播放选项内部的反馈台词),之后才会继续执行 AOptions 后面的 ALine。这种设计符合文字冒险“选择-反馈-继续”的典型流程。
与手动 API 混用
故事组件完全基于底层的 Adv API。理论上你可以在同一个故事中同时使用组件和手动 API 调用,但强烈不建议这样做,因为组件的自动推断可能会与手动注册产生冲突。坚持一种风格,会让你的故事更易于维护。