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

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

啟動期 link

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

腳本處理階段 link

Ren’Py會讀取每個遊戲中的 .rpy 文件(以及 _ren.py 文件)。讀取時按照Unicode編碼,根據路徑和檔案名順序讀取。 這就是腳本處理階段,或者說“early”階段。

創作者寫的腳本中,最早被執行的代碼是寫在 python early 代碼塊的內容。 執行這些程式碼的前提是,代碼所在的腳本文件已被讀取和處理。 這就是修改處理機制的語句需要寫在 python 中的原因,比如 創作者定義的語句創作者定義的界面語言語句 和自訂的 warpers.

有時候可能會看到 init python early,語法是正確的但多餘。不會影響代碼實際運行的順序和結果。

初始化階段 link

在腳本處理階段之後,就輪到“init”階段。某些語句在該階段運行,包括 init python語句define語句transform語句image語句screen語句style。 初始化階段又可以細分為多個連續時間段,或者說初始化優先度,分別使用-999到999間的整數作為標記。 標記數值越小,對應的時間段越早執行,即優先度越高。

image define default transform (init) screen (testcase) (translation) style

默認情況下,以上語句會以“init優先度偏移量(offset)0”執行。 不過,也可以使用 init offset語句 等方式修改執行優先度偏移量。 image語句 語句不遵循以上規則,其預設值在優先度500時間段執行。 init offset 語句修改優先度都會自動避開500這個值,而不是替換這個時間段執行的內容。

使用 images目錄 根據圖片檔案名稱自動生成圖像定義的過程,發生在優先度0時間段。

注意,default語句 不在初始化階段執行,與變數相關的過程可能會相互影響。

init offset語句 link

The init offset statement sets a priority offset for all statements that run at init time. It should be placed at the top of the file, and it applies to all following statements in the current block and child blocks, up to the next init priority statement. The statement 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。

腳本執行 link

當遊戲窗口顯示後,就進入了腳本執行階段。 普通的Ren’Py語句在此階段執行,腳本標籤(label)和主控流程 中描述的各類規則開始生效。 default語句 也在此階段運行,首次對變數賦值。 有類似功能的 define語句 則在初始化階段進行賦值操作。

遊戲正常啟動後,配置項變數的值就不該再發生改變。

啟動界面 link

若設置了啟動界面,則執行 splashscreen 標籤直到返回。

啟動界面僅在Ren’Py運行時顯示一次,之後重新運行腳本時會自動跳過。

遊戲階段 link

遊戲階段是實際可以進行遊戲內容。用戶花時間也主要是運行這部分內容。 該階段在退出遊戲、重啟遊戲或返回主選單後結束。

在遊戲階段中,ShowMenu 行為可用於在一個新的上下文(context)中顯示某個界面。

調用棧為空時,遊戲將返回到開頭並重新開始,具體解釋在 腳本標籤(label)和主控流程 章節。 MainMenu 行為和 renpy.full_restart() 函數也都可以用於重啟遊戲。

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