Ren’Py游戏的生命周期(lifecycle)
无论是直接运行可执行程序或使用启动器,运行一个Ren’Py时整个程序会执行一系列预订的步骤,直到游戏进程关闭。 本页旨在揭示整个生命周期(lifecycle)的各个步骤,以及相关的各语句。
启动阶段
在游戏窗口显示出来前,就已经处理了很多工作,即启动阶段。 启动阶段唯一能看到的内容只有 presplash。
脚本处理阶段
Ren’Py会读取游戏中的每个 .rpy 文件(以及 _ren.py 文件)。这就是脚本处理(parsing)阶段,或者说“early”阶段。
文件读取顺序如下:
renpy/common目录中的文件使用完整路径,按unicode顺序加载。这步由Ren’Py处理。仅当存在
game/libs/libs.txt文件时,game/libs目录中的文件去掉目录名,按unicode顺序加载。 例如,game/libs/plants/aloe.rpy会早于game/libs/animals/zebra.rpy加载。
game目录中的文件使用完整路径,按unicode顺序加载。 例如,game/animals/zebra.rpy会早于game/plants/aloe.rpy加载。仅当存在
game/mods/mods.txt文件时,game/mods目录中的文件去掉目录名,按unicode顺序加载。 例如,game/mods/plants/aloe.rpy会早于game/mods/animals/zebra.rpy加载。
(译者注:原文仅有1、2、5、6,不存在3和4。)
创作者写的脚本中,最早被执行的代码是写在 python early 代码块的内容。
执行这些代码的前提是,代码所在的脚本文件已被读取和处理。
这就是修改处理机制的语句需要写在 python 中的原因,比如 创作者定义的语句、创作者定义的界面语言语句 和自定义的 warpers.
有时候可能会看到 init python early,语法是正确的但多余。不会影响代码实际运行的顺序和结果。
初始化阶段
在脚本处理阶段之后,就轮到“init”阶段。某些语句在该阶段运行,包括 init python语句、define语句、 transform语句、image语句、screen语句 和 style。
初始化阶段又可以细分为多个连续时间段,或者说初始化优先级,分别使用-999到999间的整数作为标记。 标记数值越小,对应的时间段越早执行,即优先级越高。 建议游戏主体使用的init优先级范围从-99到99。 库文件优先级范围从-999到-100,Mod优先级范围从100到999。 超出-999到999范围的优先级仅限Ren’Py内部使用。
默认情况下,以上语句会以“init优先级偏移量(offset)0”执行。
不过,也可以使用 init offset语句 等方式修改执行优先级偏移量。
image语句 语句不遵循以上规则,其默认值在优先级500时间段执行。
init offset 语句修改优先级都会自动避开500这个值,而不是替换这个时间段执行的内容。
使用 images目录 根据图片文件名称自动生成图像定义的过程,发生在优先级0时间段。
注意,default语句 不在初始化阶段执行,与变量相关的过程可能会相互影响。
init offset语句
init offset 语句为所有在初始化阶段运行的语句设置了优先级偏移量(offset)。
该语句应该写在脚本文件开头,指定的偏移量(offset)对之后同一个语句块(block)及其子语句块的所有语句均生效,
除非期间出现一个init priority语句。下面这条语句:
init offset = 42
将优先级偏移量(offset)设置为42。而在下面段脚本中:
init offset = 2
define foo = 2
init offset = 1
define foo = 1
init offset = 0
第一条define语句运行在优先级2,这意味着其会在第二条define语句后运行,因此变量 foo 的最终值为2。
脚本执行
当游戏窗口显示后,就进入了脚本执行阶段。 普通的Ren’Py语句在此阶段执行,脚本标签(label)和主控流程 中描述的各类规则开始生效。
在此阶段发生变化的变量也会在游戏存档时保存,在读档时根据存档数据重新加载。
游戏正常启动后,配置项变量的值就不该再发生改变,因为Ren’Py可能缓存配置项。
启动界面之前
此阶段的内容在Ren’Py启动后,或在返回主菜单并显示主菜单之前运行。 注意,即使跳过了启动界面这部分依然会运行。
显示启动界面之前,会执行 default语句 ,然后运行 config.start_callbacks。
启动界面
若设置了启动界面,则执行 splashscreen 标签直到返回。
启动界面仅在Ren’Py运行时显示一次,之后重新运行脚本时会自动跳过。
游戏阶段
游戏阶段是实际可以进行游戏内容。用户花时间也主要是运行这部分内容。 该阶段在退出游戏、重启游戏或返回主菜单后结束。
在游戏阶段中,ShowMenu 行为可用于在一个新的上下文(context)中显示某个界面。
游戏阶段将一直持续,知道玩家主动退出游戏或选择返回主菜单。
脚本标签调用栈为空时,游戏将返回到开头并重新开始,具体解释在 脚本标签(label)和主控流程 章节。
MainMenu 行为和 renpy.full_restart() 函数也都可以用于重启游戏。
游戏重头开始时,所有非持久化数据都会重置为脚本处理阶段最后设置的值,然后脚本从头开始执行,跳过启动界面。