Skip to content

Python语句 ​

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

学习目标 ​

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

核心语法 ​

  • $
  • python:
  • define
  • default
  • init python
  • renpy.*

可运行示例 ​

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    # 玩家是否到过某 label

8. 存储与命名空间 store ​

所有脚本级变量都在 store 命名空间。Python 里访问要点:

text
init python:
    def reset_game():
        store.money = 0
        store.inventory = []

常见坑 ​

  • 可变量一定用 default,否则读档/回滚可能得到意外值。
  • define 的值在加载期固定,不能依赖运行期变量。
  • init python: 里别直接改剧情变量(那时存档系统还没就绪),定义函数/类即可。
  • 列表/字典等可变对象,回滚(rollback)会自动还原;自己缓存的非存档状态要在 after_load 重建。

官方参考 ​

在 GenPy 里怎么做 ​

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

推荐继续阅读:

Built for GenPy creators.