流程控制
涵盖顺序、并发、循环、标签跳转与等待点击的 `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>>