持久化數據 link

Ren’Py支持持久化數據,保存遊戲中與某個特定時間點無關的數據。綁定了變數 persistent 的持久化對象欄位(field),可以讀寫並實現持久化數據。

當Ren’Py進程結束時,所有與 persistent 關聯的數據都會被保存,也可以透過調用 renpy.save_persistent() 。當Ren’Py啟動或者檢測到磁碟上的持久化數據更新過時,會載入持久化數據。

持久化對象有個特殊情況,就是接入一個未定義的欄位(field)時會得到一個None,而不是觸發一個異常。

使用持久化的例子是創建一個能解鎖的圖片畫廊。透過持久化存儲一個標誌(flag),就能判斷畫廊是否被解鎖,比如:

label gallery:

    if not persistent.gallery_unlocked:
        show background
        centered "你還沒有解鎖畫廊。"
        $ renpy.full_restart()

    # 這裡實際展示畫廊。

當用於獲得了某個解鎖畫廊的結局,這個標誌(flag)必須設置為True。

$ persistent.gallery_unlocked = True

由於持久化數據在初始化Python語句塊(block)之前載入,所以持久化數據應該只包含Python和Ren’Py的原生數據類型。不過,定義在 python early 語句塊(block)中的類可以使用,提供的那些類可以被pickle和賦值。

合併持久化數據 link

有些時候Ren’Py需要合併源自兩處的持久化數據。例如,Ren’Py可能需要合併來自USB驅動器和本地設備兩個地方的持久化數據。

Ren’Py使用“欄位對齊”的形式進行分析,最終使用各欄位中更新事件更晚的值。在某些情況下,這不是我們需要的行為。這時,可以使用 renpy.register_persistent() 函數。

例如,如果我們有一個已經看過的結局的集合(set),我們合併數據時就希望取一個合集。

init python:
    if persistent.endings is None:
        persistent.endings = set()

    def merge_endings(old, new, current):
        current.update(old)
        current.update(new)
        return current

    renpy.register_persistent('endings', merge_endings)

持久化函數 link

persistent._clear(progress=False) link

重設持久化數據。

progress
若為True,同時重設Ren’Py內部的進度數據。

請注意,該函數將刪除所有持久化數據,並預設在Ren’Py重啟之前不再響應對該函數的調用。

renpy.register_persistent(field, func) link

註冊一個函數,用於合併磁碟上的持久化欄位(field)值和當前持久化對象的值。

field
持久化對象的欄位(field)名。
func

該函數使用 oldnewcurrent 三個參數。

old
舊對象域的值。
new
新對象域的值。
current
當前持久化對象域的值。這個參數用於域引用的對象標識符無法改變的情況。

該函數需要返回持久化對象域的新值。

renpy.save_persistent() link

將持久化數據保存到磁碟。

多個遊戲數據的持久化 link

多遊戲數據持久化是一個允許在多個Ren’Py遊戲中共享訊息的特性(feature)。如果你計劃製作一個遊戲系列,並在系列遊戲中共同使用某些訊息,就有可能用得上這個特性。

需要使用多元持久化數據,必須在初始化語句塊(init block)中創建一個MultiPersisten對象。用戶可以更新這個對象,並調用其save方法保存至磁碟。未定義的欄位(field)預設值為None。為了確保這個對象可以能再次正確載入,我們不建議聲明用戶自訂類型數據對象。

class MultiPersistent(key, save_on_quit=False) link

創建一個新的MultiPersistent對象。這個類的構造函數應該只能在初始化語句塊(init block)中調用,並根據給定的key創建一個新的MultiPersistent對象。

key
用於接入多元持久化數據的key。使用相同key的遊戲可以接入同一個多元持久化數據。
save_on_quit
若為True,Ren’Py進程結束時自動保存該對象。
save() link

將多元持久化數據保存至磁碟。當數據修改後必須調用這個函數。

這裡的樣例,選取了一個分成兩部的遊戲。這是第一部:

init python:
    mp = MultiPersistent("demo.renpy.org")

label start:

    # ...

    # 記錄用戶運行第一部的結果

    $ mp.beat_part_1 = True
    $ mp.save()

    e "你打通了第一部。我們第二部再見!"

這是第二部:

init python:
    mp = MultiPersistent("demo.renpy.org")

label start:

    if mp.beat_part_1:
         e "你已經打通了第一步,歡迎來到第二部!"
    else:
         e "呣,你還沒有玩過第一部,為什麼不先試試第一部呢?"