学习空间/剧情旗标与状态:记录事实,而不是猜画面
状态与流程 / LESSON 17

剧情旗标与状态:记录事实,而不是猜画面

先用明确布尔条件建立可重现流程。

基础约 8 分钟阅读,实作另计7 节现在学
CONCEPT MAP先看一眼知识之间的联系
先看一眼知识之间的联系01记录事实02统一推导03检查转移04更新表现05完整重置
事实决定允许的行为,界面从状态派生;重置应恢复整个约定起点,而不只清空两个变量。

01事实与派生结果

“玩家读过提示”是事实;“出口现在允许使用”可能由两个事实推导。尽量避免多个位置各自存储一份“门能不能开”而互相矛盾。先决定唯一事实来源,再让 UI、动画或音效根据事实更新。以下 A、B 条件仅为逻辑练习,不是第一章谜题。

02交互真值实验

尝试四种输入组合,观察“未就绪 / 可继续 / 已结束”如何变化。点击重置会同时恢复条件和反馈。这个状态实验不写入游戏存档,也不代表正式卧室需要两件道具。

03带幂等性的状态脚本

state_practice.gd gdscript
extends Node
signal progression_changed(allowed: bool)

var has_a: bool = false
var has_b: bool = false
var finished: bool = false

func can_continue() -> bool:
    return has_a and has_b and not finished

func set_condition_a(value: bool) -> void:
    has_a = value
    progression_changed.emit(can_continue())

func set_condition_b(value: bool) -> void:
    has_b = value
    progression_changed.emit(can_continue())

func try_finish() -> bool:
    if not can_continue():
        return false
    finished = true
    progression_changed.emit(false)
    return true

func reset_practice() -> void:
    has_a = false
    has_b = false
    finished = false
    progression_changed.emit(false)

04怎么验证,而不是只看正常路径

把脚本挂在 Node,通过临时测试调用依次尝试空条件、只有 A、只有 B、同时满足、完成后再次调用、重置后调用。首次完成后 finished 为 true,重复调用应返回 false;这是“不会重复推进”的清楚约定。若以后引入枚举状态,先画合法转移图,不要只多加几个布尔变量。

05先写事实,再写由事实推导出来的答案

在纸上列两栏:左边记录确实发生过的事情,右边写根据它们计算出的结果。比如练习条件甲和乙是否完成是事实,是否允许继续则可以由两个事实共同推导。如果你又在不同脚本中分别维护 allow_exit、door_ready 和 can_finish,就要让三份结果始终一致,修改规则时很容易漏掉其中一份。

从本课两个条件开始,只修改 can_continue 的规则,检查界面与按钮是否都使用同一个判断。先测试同时满足,再故意撤回一个条件,观察提示是否跟着变化。规则变更不是只改一行布尔表达式;你还要确认所有表现都读取同一个事实来源。正式游戏可能有不同的不可逆事件,但教学实验可以允许撤回,帮助你看清依赖关系。

06用状态转移表发现说不清的情况

布尔值适合表达简单事实,多个互斥阶段则更适合先画状态图。例如一个练习流程只能处于未开始、进行中、已结束之一;同时出现“未开始而且已结束”通常没有意义。不要因为学过 enum 就把所有数据都改成枚举,也不要用越来越多的布尔值绕开状态互斥关系。先问哪些组合有意义,再选表达方式。

制作一张表,每行写当前状态、触发动作、是否允许、下一状态和反馈。至少包含正常推进、提前尝试、重复完成和重置。对于不允许的动作,也要决定玩家看到什么,而不是只让函数悄悄 return。表里有一格无法回答,说明设计关系还没清楚;继续加脚本只会把这份不确定藏进代码。

07把重置理解为恢复约定起点,而不是随手清几个值

一个可重复练习要重置的不只是 has_a 和 has_b,还包括 finished、界面文字、按钮状态以及可能存在的临时输入锁。可以让界面在收到状态变化后重新计算显示,而不是在 reset 中复制一套平时用的界面规则。这样新增一个提示时,不容易忘记让重置路径同步更新。

验收时先完成全部流程,再执行重置,然后故意只满足一个条件,确认旧的完成结果没有残留。再停止运行并重新启动,比较这是重新创建场景还是同一实例内重置。两者看起来都回到起点,但生命周期不同。最后写清哪些事实只存在当前场景,哪些未来需要跨场景保存;本课不自动引入全局管理器。能解释状态的来源、合法变化和重置范围,才算掌握了旗标,而不是仅知道 true 和 false 的拼写。

动手后,再勾选

不是“我看懂了”,而是你在独立练习里做出并检查过。

CHECK YOUR UNDERSTANDING

换一个情景,你会怎么判断?

多个 UI 各存一份门状态,最容易出现什么问题?

用自己的话,留一条笔记

可以写“我之前以为……,现在发现……”,或者记录还没解决的问题。

仅保存在此浏览器0 / 20000

回到资料核对

本课是解释与练习,不替代对应版本的官方手册。网页实验不运行 Godot;未标明实机验证的代码,仍需在独立工程中检查。

把这课收进你的理解里。

标记已读不会自动勾选实作,也不代表游戏功能已经完成。

输入一个你想弄明白的问题。

按 Esc 关闭 · 标题、关键词和正文一起搜索