Ren’Py遊戲的生命週期(lifecycle)

無論是直接運行可執行程序或使用啟動器,運行一個Ren’Py時整個程序會執行一系列預訂的步驟,直到遊戲進程關閉。 本頁旨在揭示整個生命週期(lifecycle)的各個步驟,以及相關的各語句。

啟動階段

在遊戲窗口顯示出來前,就已經處理了很多工作,即啟動階段。 啟動階段唯一能看到的內容只有 presplash

腳本處理階段

Ren’Py會讀取遊戲中的每個 .rpy 文件(以及 _ren.py 文件)。這就是腳本處理(parsing)階段,或者說“early”階段。 文件讀取順序如下:

  1. renpy/common 目錄中的文件使用完整路徑,按unicode順序載入。這步由Ren’Py處理。

  2. 僅當存在 game/libs/libs.txt 文件時,game/libs 目錄中的文件去掉目錄名,按unicode順序載入。 例如,game/libs/plants/aloe.rpy 會早於 game/libs/animals/zebra.rpy 載入。

  1. game 目錄中的文件使用完整路徑,按unicode順序載入。 例如,game/animals/zebra.rpy 會早於 game/plants/aloe.rpy 載入。

  2. 僅當存在 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() 函數也都可以用於重啟遊戲。

遊戲從頭開始時,所有非持久化數據都會重設為腳本處理階段最後設置的值,然後腳本從頭開始執行,跳過啟動界面。