游戏内菜单
本页属于 GenPy Ren'Py 学习路线。教程内容面向 Ren'Py 8.x,并在页面末尾连接到 GenPy 的对应工作流。
学习目标
- 了解“游戏内菜单”在 Ren'Py 项目中的用途。
- 能在一个最小项目里验证本章相关语法或工作流。
- 知道发布前需要检查的常见风险,并能在 GenPy 中继续维护。
核心语法
menuifsetjumpdefault
可运行示例
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 校验结果,确认脚本、素材和发布路径一致。
推荐继续阅读:
