_ren.py 文件——Python中的Ren’Py link

在複雜的遊戲中,可能某些檔案大多數內容都是Python代碼,只有一小部分是Ren’Py語句,比如 init python 把Python代碼引入Ren’Py。 Ren’Py還有其他方法,專門用於這種偏重Python的文件。檔案名以 _ren.py 結尾的文件,可以使用純Python語法編寫,並轉換為Ren’Py腳本再處理。

採用這種機制的原因有兩個:

  • _ren.py 類文件中的Python代碼可以少一層縮進。

  • 編輯器可以打開 _ren.py 類文件時將語言類型設置為Python,然後啟用代碼分析和重構操作。 Ren’Py中的Python則無法使用Python語言工具。

Python中的Ren’Py檔案名以 _ren.py 結尾,比如 actions_ren.py。 這類文件的處理流程與其他 .rpy 文件相同,都是按Unicode編碼的順序處理。 因此,actions_ren.py 文件的處理時機與 actions.rpy 相同。 如果兩個文件的檔案名去掉 _ren.py 或 .rpy 後完全相同,Ren’Py將會報錯。 例如,同一個目錄下同時存在 actions.rpyactions_ren.py 兩個文件就會報錯。

語法和格式轉換 link

Python中的Ren’Py文件包含三類內容:

  • 文件開頭的部分直接會忽略。一般是Python中模組引用或其他構造代碼,用於編輯器或插件的功能,但在Ren’Py中不會執行。

  • 一段或多段Ren’Py代碼,通常包含Ren’Py語法的腳本。 Ren’Py語法的腳本通常用於引入Python代碼,也用於設置Python代碼的縮進。

    Ren’Py語法的代碼以 """renpy 開頭,以 """ 結尾。 開頭和結尾的兩個特殊語義符號都要放在那行開頭,不使用任何縮進。 如果開頭和結尾中任何一行有縮進,該文件就無法被正確處理。

  • 一行或多行Python代碼。Python代碼一般放在Ren’Py代碼後面,並比前一段非空白非注釋的Ren’Py代碼多一級縮進。 如果Python代碼行尾是冒號 (:),則下一段代碼多縮進4個空格。

這種格式轉換用戶在記憶體中創建等效的 .rpy 文件,並以通用方式編譯該文件。 注意,Python中的Ren’Py依然使用Ren’Py儲存空間(而不是在一個模擬模組中),並且Python代碼遵循以上格式轉換規則, 以實現回滾和存檔/讀檔功能,詳見 Python語句回滾 章節。

樣例 link

下面是一個 _ren.py 文件的樣例:

# 遊戲中不會使用這行程式碼。這裡的代碼僅讓編輯器知道strength變數的類型。
strength = 100

"""renpy
init python:
"""

class BoostStrength(Action):
    """
    玩家控制角色的力量值(strength)增加10點。
    """

    def __call__(self):
        global strength
        strength += 10
        renpy.restart_interaction()

格式轉換後的文件會變成(某些空行被刪除):

init python:

    class BoostStrength(Action):
        """
        玩家控制角色的力量值(strength)增加10點。
        """

        def __call__(self):
            global strength
            strength += 10
            renpy.restart_interaction()