NarraLeaf

流程控制

涵盖顺序、并发、循环、标签跳转与等待点击的 `Control` 流程控制类

Control 提供流程控制的实用方法

Control.do([
    character1.say("hello"),

    // 并行执行
    Control.allAsync([
        sound.play(),
        shake(image1),
    ]),
]);

静态方法

do

顺序执行操作,等待每个操作完成:

  • actions: ActionStatements - ActionStatements
  • 返回 Proxied<Control, Chained<LogicAction.Actions>>

doAsync

顺序执行操作,不等待完成:

  • actions: ActionStatements - ActionStatements
  • 返回 Proxied<Control, Chained<LogicAction.Actions>>

any

并行执行所有操作,等待任意一个完成:

  • actions: ActionStatements - ActionStatements
  • 返回 Proxied<Control, Chained<LogicAction.Actions>>

all

并行执行所有操作,等待全部完成:

  • actions: ActionStatements - ActionStatements
  • 返回 Proxied<Control, Chained<LogicAction.Actions>>

allAsync

并行执行所有操作,不等待完成:

  • actions: ActionStatements - ActionStatements
  • 返回 Proxied<Control, Chained<LogicAction.Actions>>

repeat

重复执行操作:

  • times: number - 次数
  • actions: ActionStatements - ActionStatements
  • 返回 Proxied<Control, Chained<LogicAction.Actions>>

whileLoop

条件为真时持续执行:

const loopState = new Persistent("loop-state", {
    tries: 0,
});

story.registerPersistent(loopState);

scene.action([
    loopState.set("tries", 0),

    Control.whileLoop(loopState.evaluate("tries", (tries) => tries < 3), [
        character.say`第 ${loopState.get("tries")} 次尝试`,
        loopState.set("tries", (tries) => tries + 1),
    ]),
]);
  • condition: Lambda<boolean> | LambdaHandler<boolean> - 条件表达式
  • actions: ActionStatements - ActionStatements
  • 返回 Proxied<Control, Chained<LogicAction.Actions>>

breakLoop

跳出当前循环(repeat/while),仅在循环体内有效:

scene.action([
    Control.whileLoop(loopState.evaluate("tries", (tries) => tries < 10), [
        Condition.If(loopState.equals("tries", 3), [
            character.say("到这里停止。"),
            Control.breakLoop(),
        ]),
        loopState.set("tries", (tries) => tries + 1),
    ]),
]);
  • 返回 Proxied<Control, Chained<LogicAction.Actions>>

sleep

等待指定时长:

  • duration: number | Awaitable<any> | Promise<any> - 等待时长
  • 返回 Proxied<Control, Chained<LogicAction.Actions>>

waitForClick

暂停执行,等待用户点击舞台(不含对话框、菜单等 GUI 元素)。类似于在 Sentence 中插入无时长的暂停

适用于 ADV 模式中创建"点击继续"的停顿:

scene.action([
    character.say("请仔细阅读..."),
    Control.waitForClick(),
    character.say("我们继续。"),
]);
  • 返回 Proxied<Control, Chained<LogicAction.Actions>>

label

在当前场景内标记一个跳转点,供 jump 使用。label 运行时不可见,仅作为跳转目标

label 名称仅在当前场景内有效,不同场景可复用同名。同一场景内重复声明会导致构建失败

scene.action([
    Control.label("intro"),
    character.say("开始吧。"),
]);
  • name: string - label 名称,当前场景内唯一
  • 返回 Proxied<Control, Chained<LogicAction.Actions>>

jump

跳转到同一场景内的某个 label 并继续播放

Scene.jumpTo 不同,Control.jump 不会卸载或重新初始化场景,只移动播放头。目标必须是同一场景内已声明的 label

Control.jump 会重定向主剧本流程,应放在分支末尾(如菜单选项)。若要循环场景,请通过菜单或条件驱动,而非从循环体中跳出

scene.action([
    Control.label("start"),
    Menu.prompt("再来一次?")
        .choose("是", [Control.jump("start")])
        .choose("否", []),
]);
  • name: string - 目标 label 名称
  • 返回 Proxied<Control, Chained<LogicAction.Actions>>

本页目录