腳本標籤(label)和主控流程 link

label語句 link

label語句允許使用自訂的標籤名聲明一個程序點位。這些標籤僅僅用來被調用或者跳轉,可以使用在Ren’Py腳本、python函數及各類界面中。

label sample1:
    "這是一個'sample1'腳本標籤。"

label sample2(a="default"):
    "這是一個'sample2'腳本標籤。"
    "a = [a]"

一個label語句可能只跟某一個語句塊(block)關聯。在那種情況下,主控流程遇到label語句就會進入關聯語句塊(block),並順序執行之後的語句。

總共有兩種腳本標籤(label):globallocal 。global標籤在所有項目文件中都生效,所以每個遊戲中都不能重複定義。local標籤在邏輯上比global標籤有效範圍小,僅限於聲明local標籤的文件。需要聲明一個local標籤的話,在標籤名前綴一個英文句號“.”即可。例如:

label global_label:
    "這是在一個global腳本標籤裡。"
label .local_name:
    ".這裡屬於local腳本標籤。"
    jump .local_name

local腳本標籤可以在global腳本標籤中定義,並被被直接引用,引用時使用該local標籤的完整名。一個關於global標籤和local標籤的例子如下:

label another_global:
    "現在讓我們跳轉進入其他地方的local腳本標籤。"
    jump global_label.local_name

lable語句可以帶一些可選參數。這些參數的處理在 PEP 3102 中有詳細說明,這裡僅說兩種例外:

  • 語句被調用時,才計算默認參數的值。
  • 變數具有動態生命週期。

如果某個變數具有動態生命週期,它的值會持續到其所屬的label標籤中出現一個return語句為止。 嘗試使用jump或previous語句傳遞該變數的值都是不明智的。 帶有參數的label樣例,詳見 call語句

jump語句 link

jump語句用於將主控流程轉入給定的腳本標籤(label)處。

若出現了 expression (表達式)關鍵字,關鍵字後面的表達式將被賦值,而被計算後的對應字串則會被用作跳轉目標的標籤語句。若未出現 expression (表達式)關鍵字,跳轉目標的標籤名字就必須精確指定。

與call語句不同,jump語句不會將下一個語句放入棧(stack)中。因此,執行完跳轉標籤對應的語句塊之後,主控流程不會回到跳轉前的腳本位置。

label loop_start:

    e "哦,不!看起來我們陷入了一個無限循環之中。"

    jump loop_start

call語句 link

call語句用於將主控流程轉入給定的腳本標籤(label)處。call語句會將下一條語句壓入到調用棧(stack)中,並允許主控流程在執行完這次調用後,回到調用發生的腳本位置。

若出現了 expression (表達式)關鍵字,關鍵字後面的表達式將被賦值,而被計算後的對應字串則會被用作跳轉目標的標籤語句。若未出現 expression (表達式)關鍵字,跳轉目標的標籤名字就必須精確指定。

from 分句是可選的,在label語句後面直接添加入參名和值,並直接在該label下直接使用。一個命名直接的標籤(lable)有助於我們能利用棧(stack)回到腳本裡合適的地方,就算載入的是修改過的腳本。

label start:

    e "首先,我們調用一個支線(subroutine)。"

    call subroutine

    call subroutine(2)

    call expression "sub" + "routine" pass (count=3)

    return

label subroutine(count=1):

    e "我來過這裡 [count] 次了。"
    e "接著,我們會從支線(subroutine)返回。"

    return

call語句可以帶入參的情況,在PEP 3102中有詳細說明。

當我們使用一個帶入參列表的調用表達式時,必須在表達式和入參列表之間插入關鍵字 pass 。否則,入參列表會被當作表達式的一部分,而不是call語句的一部分。

return語句 link

return語句會在調用棧中彈出最頂層的那條語句,並將主控流程轉到那條語句。若調用棧為空,返回語句將重啟Ren’Py,將主控流程切換至主選單。

若返回語句帶有可選項表達式,表達式會被計算求值,並且結果會被存儲在_return變數中。_return變數依賴於各種場景動態變化。

特殊腳本標籤(label) link

以下腳本標籤(label)會在Ren’Py中使用:

start
默認情況下,Ren’Py在遊戲啟動後會跳轉至這個標籤。
quit
若該標籤存在,當用戶退出遊戲時該標籤內容會被調用。
after_load
若該標籤存在,當遊戲讀檔後會調用這個標籤內容。其可能被用於遊戲內容更新後的數據修復。
splashscreen
若該標籤存在,遊戲首次運行時,在主選單出現前,該標籤內容會被調用。 詳見 添加啟動畫面
before_main_menu
若該標籤存在,在主選單出現前,該標籤內容會被調用。在少數情況下,其用來設置主選單,例如背景播放一段影片。
main_menu

若該標籤存在,標籤內容會被調用,用來替代預設的主選單。若其內容中包含return語句,Ren’Py將從start標籤處開始遊戲。例如,下面這段腳本在不顯示主選單的情況下開始遊戲。

label main_menu:
    return
after_warp
若該標籤存在,則調用warp語句時,此標籤至傳送(warp)點前的語句都將被執行。詳見 傳送至某行
hide_windows
若該標籤存在,當玩家使用滑鼠右鍵或鍵盤H鍵隱藏對話窗口時,將調用此標籤。 若標籤返回值為True,隱藏對話窗口行為將取消(依然當作隱藏已經發生)。否則,繼續隱藏對話窗口。

腳本標籤(label)和主控流程函數 link

renpy.call_in_new_context(label, *args, **kwargs) link

該函數創建一個新的上下文(context),並從這個上下文(context)中給定的腳本標籤(label)處開始執行Ren’Py腳本。新的上下文(context)中禁用了回滾功能,並且存檔/讀檔會發生在頂層的上下文(context)中。

使用該函數可以在原有交互中啟動第二層交互。

renpy.get_all_labels() link

返回程序中定義所有標籤(lable)的集合,包括在庫(library)中定義為僅限內部引用的標籤。

renpy.get_return_stack() link

返回一個當前返回(return)棧(stack)的列表。返回棧是一個語句名組成的列表。

該語句名應是字串(針對標籤),或者非空元組(針對非標籤型語句)。

renpy.has_label(name) link

若參數name是一個程序內的合法腳本標籤(label)就返回True,否則返回False。

name
name應該是一個用於字串,用於檢查某個腳本標籤(label)是否存在。name也可以是一個非空元組,元組給定了非標籤型語句名。
renpy.invoke_in_new_context(callable, *args, **kwargs) link

該函數創建了一個新的上下文(context),並在上下文(context)中顯示調用了給定的python可調用內容(通常是函數)。當函數返回了值或者拋出異常時,主控流程會返回到原來的上下文(context)。當我們在同一個句柄(handle)中向玩家展示一些訊息(比如確認提示),就可以調用這個函數。

某個上下文(context)包含顯示(包括界面和圖片)和音訊系統的狀態。當上下文(context)返回時,顯示和音訊狀態都會被存儲起來。

附加參數和關鍵字參數會被傳入可調用的(函數)。

使用這個函數創建的上下文(context)無法執行Ren’Py腳本。會改變Ren’Py腳本流程的函數,比如renpy.jump(),只能在外層上下文(context)下被處理。如果你想要調用的是Ren’Py腳本而不是python函數,就應該使用renpy.call_in_new_context()函數。

renpy.jump_out_of_context(label) link

調用該函數會引起主控流程離開當前上下文(context),並轉換到父上下文(context)中指定的腳本標籤(label)處。

renpy.seen_label(label) link

在當前用戶系統內,名為label的標籤語句至少被執行了一次,則返回True,否則返回False。該概述常用於解鎖場景畫廊(gallery)等。

renpy.set_return_stack(stack) link

設置當前返回(return)棧(stack)。返回棧是一個語句名組成的列表。

語句名可能是字串(針對標籤)或者非空元組(針對非標籤語句)。