Skip to content

游戏内菜单 ​

本页属于 GenPy Ren'Py 学习路线。教程内容面向 Ren'Py 8.x,并在页面末尾连接到 GenPy 的对应工作流。

学习目标 ​

  • 了解“游戏内菜单”在 Ren'Py 项目中的用途。
  • 能在一个最小项目里验证本章相关语法或工作流。
  • 知道发布前需要检查的常见风险,并能在 GenPy 中继续维护。

核心语法 ​

  • menu
  • if
  • set
  • jump
  • default

可运行示例 ​

text
label investigate:
    menu:
        set seen_choices       # 选过的选项加入该集合并隐藏

        "查看书架":
            "全是旧书。"
        "查看抽屉":
            "里面有一把钥匙。"
        "离开":
            jump leave
    jump investigate           # 回到菜单,已选项不再出现

教程正文 ​

玩家选择用 menu 语句实现,是分支叙事的关键。

1. 基本菜单 ​

text
menu:
    "你要去哪里?"          # 可选的提示语(caption)
    "去公园":
        jump park
    "回家":
        jump home
    "待在原地":
        "你决定哪都不去。"
  • 第一行不带冒号的字符串是提示语(caption),可省略。
  • 每个 "选项": 后缩进写该分支的语句块。
  • 选项块结束后,若没有 jump,会自然汇流到 menu 之后继续执行。

2. 带条件的选项(if) ​

用 if 表达式 控制某选项是否出现:

text
menu:
    "买苹果(5 元)" if money >= 5:
        $ money -= 5
        "你买了一个苹果。"
    "买不起的豪车" if money >= 1000000:
        "土豪专属选项。"
    "什么都不买":
        "你捂紧了钱包。"

条件为 False 的选项不显示。

3. set:选过即隐藏(一次性选项) ​

set 集合 让选过的选项不再出现,适合“调查类”反复进入的菜单:

text
label investigate:
    menu:
        set seen_choices       # 选过的选项加入该集合并隐藏

        "查看书架":
            "全是旧书。"
        "查看抽屉":
            "里面有一把钥匙。"
        "离开":
            jump leave
    jump investigate           # 回到菜单,已选项不再出现

4. 给选项加参数 / 关联值 ​

选项可携带返回值,配合 $ result = menu(...)(较少用)或在块内处理。常见做法是块内直接改变量:

text
default affection = 0
menu:
    "称赞她":
        $ affection += 1
        e "谢谢你!"
    "嘲笑她":
        $ affection -= 1
        e "你真没礼貌。"

5. 菜单参数与样式 ​

可给 menu 传参数(如自定义 screen、设置):

text
menu (screen="choice"):
    "选项 A":
        pass
    "选项 B":
        pass

菜单外观由 screens.rpy 中的 screen choice(): 决定,可在那里改按钮样式、布局(见第 16 章)。

6. 把对话作为提示语 ​

提示语可用角色台词形式(需要 menu 配合 nointeract 或直接写在 menu 前)。常见模式:

text
e "你怎么选?"
menu:
    "同意":
        e "好的。"
    "拒绝":
        e "可惜。"

让角色先说话,再弹出选项,体验更自然。

7. 嵌套与跳转模式 ​

  • 分支后汇流:各选项块不 jump,结束后回到 menu 之后统一继续。
  • 分支后分流:各选项块 jump 到不同 label,彻底分叉。
  • 循环菜单:menu 末尾 jump 回菜单 label(配合 set 或条件避免死循环)。

8. 从 Python / 屏幕调用 ​

text
$ result = renpy.display_menu([("选项A", "a"), ("选项B", "b")])
if result == "a":
    ...

或在屏幕语言里用 textbutton + Jump()/Return() 自定义选择界面(见第 16 章)。

常见坑 ​

  • 选项后忘记冒号、缩进不齐是常见报错。
  • 用条件选项时确保至少有一个可见选项,否则菜单为空会出问题。
  • set 用的集合变量要能被存档(用 default 定义为 set())。
  • 循环菜单务必有退出路径,避免玩家被卡死。

官方参考 ​

在 GenPy 里怎么做 ​

  • 在 GenPy 的代码模式中维护相关 .rpy 文件,先保持语法清晰,再逐步加入本章功能。
  • 用故事图谱、变量、校验或演出编辑器把“能运行”提升到“可维护”。
  • 导出前结合 Ren'Py Lint 和 GenPy 校验结果,确认脚本、素材和发布路径一致。

推荐继续阅读:

Built for GenPy creators.