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() 函數也都可以用於重啟遊戲。
遊戲從頭開始時,所有非持久化數據都會重設為腳本處理階段最後設置的值,然後腳本從頭開始執行,跳過啟動界面。