Python语句
本页属于 GenPy Ren'Py 学习路线。教程内容面向 Ren'Py 8.x,并在页面末尾连接到 GenPy 的对应工作流。
学习目标
- 了解“Python语句”在 Ren'Py 项目中的用途。
- 能在一个最小项目里验证本章相关语法或工作流。
- 知道发布前需要检查的常见风险,并能在 GenPy 中继续维护。
核心语法
$python:definedefaultinit pythonrenpy.*
可运行示例
text
define e = Character("艾琳") # 角色:不变 → define
define DAYS_PER_WEEK = 7 # 常量 → define
default money = 0 # 玩家金钱:会变 → default
default flags = {"met_eileen": False}
default inventory = []教程正文
Ren'Py 脚本背后就是 Python。需要逻辑、计算、数据时,可以无缝混入 Python。
1. 内联 Python:$
$ 后跟一行 Python 语句:
text
$ money = 100
$ money += 50
$ player_name = renpy.input("你叫什么名字?")
$ renpy.notify("已保存设置")2. Python 块:python:
多行逻辑用 python: 块:
text
python:
money = 100
items = ["剑", "盾"]
def add_item(name):
items.append(name)
add_item("药水")python early:(更早执行,用于声明)、python hide:(变量不污染全局,少用)等变体存在。
3. define vs default(关键区别!)
| 语句 | 用途 | 是否进存档 | 何时求值 |
|---|---|---|---|
define | 不变的对象/常量 | 否 | 加载期一次 |
default | 会变化且需随存档保存的变量 | 是 | 游戏开始/读档时 |
text
define e = Character("艾琳") # 角色:不变 → define
define DAYS_PER_WEEK = 7 # 常量 → define
default money = 0 # 玩家金钱:会变 → default
default flags = {"met_eileen": False}
default inventory = []黄金法则:会随剧情改变、需要存档记住的,用
default;定义一次就不动的,用define。 直接用$ money = 0放在 start 里也行,但default更安全(读档/回滚正确,且只初始化一次)。
4. 在台词里用变量
text
default name = "无名"
label start:
$ name = renpy.input("你的名字?") or "无名"
e "你好,[name]!"
e "你有 [money] 元。"- 文本插值用
[变量],支持格式化:[money:>5]、[pi:.2f]。 - 也可用
"%(name)s"旧式,但[ ]更直观。
5. 定义函数并在脚本中调用
text
init python:
def heal(amount):
global hp
hp = min(100, hp + amount)
return hp
default hp = 50
label start:
$ heal(30)
e "现在 HP 是 [hp]。"init python:在游戏启动初始化阶段运行,用于定义函数、类、注册资源。- 普通
python:/$在剧情执行到时运行。
6. init 优先级
text
init -1 python: # 数字越小越早;默认 0
...
init python:
...
init 1 python: # 越大越晚
...需要保证某些定义先于其他执行时,用优先级控制顺序。
7. 调用 Ren'Py API(renpy.*)
常用:
text
$ renpy.jump("chapter2")
$ renpy.call_screen("inventory")
$ renpy.pause(1.0)
$ renpy.notify("提示文字")
$ name = renpy.input("请输入:")
$ renpy.play("audio/se.ogg")
$ if renpy.seen_label("ending_a"): pass # 玩家是否到过某 label8. 存储与命名空间 store
所有脚本级变量都在 store 命名空间。Python 里访问要点:
text
init python:
def reset_game():
store.money = 0
store.inventory = []常见坑
- 可变量一定用
default,否则读档/回滚可能得到意外值。 define的值在加载期固定,不能依赖运行期变量。init python:里别直接改剧情变量(那时存档系统还没就绪),定义函数/类即可。- 列表/字典等可变对象,回滚(rollback)会自动还原;自己缓存的非存档状态要在
after_load重建。
官方参考
- Python 语句:https://www.renpy.org/doc/html/python.html
- 语句等价物:https://www.renpy.org/doc/html/statement_equivalents.html
在 GenPy 里怎么做
- 在 GenPy 的代码模式中维护相关 .rpy 文件,先保持语法清晰,再逐步加入本章功能。
- 用故事图谱、变量、校验或演出编辑器把“能运行”提升到“可维护”。
- 导出前结合 Ren'Py Lint 和 GenPy 校验结果,确认脚本、素材和发布路径一致。
推荐继续阅读:
