頭像 link

許多視覺小說會在角色發言時,在對話內容旁邊顯示一張該角色的頭像。Ren’Py把這個頭像稱作頭像(side image),並支持自動選擇和顯示對話的頭像。

使用頭像的前提是,定義 Character() 時使用一個關聯的圖像標籤(tag):

define e = Character("艾琳", image="eileen")

當某個帶有關聯圖像標籤的角色發言時,Ren’Py會創建一個圖像屬性(attribute)池。關聯圖像標籤會被添加到這個池,當前圖像屬性與那個圖像標籤關聯。

根據圖像標籤選擇關聯的頭像時,Ren’Py會嘗試在圖像屬性池中找到帶有標籤“side”且帶有儘可能大的屬性值的圖片。如果沒有找到符合條件的圖片,或者找到多個帶有相同屬性值的圖像,就顯示 Null

例如,假設我們有如下腳本:

define e = Character("艾琳", image="eileen")

image eileen happy = "eileen_happy.png"
image eileen concerned = "eileen_concerned.png"

image side eileen happy = "side_eileen_happy.png"
image side eileen = "side_eileen.png"

label start:

    show eileen happy

    e "我們把線段的這端稱作點A。"

    e concerned "線段的另一端稱作點B。"

在point A,角色 e 正在發言,關聯的圖像標籤是“eileen”。當“eileen happy”圖像顯示時,圖像屬性池的標籤裡有“eileen”和“happy”。我們尋找帶有“side”圖像標籤的圖像,以及儘可能多的屬性——我們就能匹配到“side eileen happy”,最終顯示為頭像。

在point B,顯示的圖像是“eileen concerned”。當前屬性池裡是“eileen”和“concerned”。唯一匹配的圖像是“side eileen”,這也是Ren’Py最終選用的圖像。如果存在一個“side concerned”圖像,由於其命名不清晰,Ren’Py不會顯示它。

不可視角色 link

另一個頭像的用處,是當用戶角色的對話內容,顯示一個頭像。做法是將某個圖像與角色關聯,然後使用帶圖形結構的say語句選擇顯示的頭像。

舉例:

define p = Character("Player", image="player")

image side player happy = "side_player_happy.png"
image side player concerned = "side_player_concerned.png"

label start:

    p happy "這裡會顯示 'side player happy' 圖像。"

    p "這裡會顯示 'side player happy' 。"

    p concerned "這裡會顯示 'side player concerned' 。"

變種 link

頭像有一些變換,分別由一些配置項控制。

define config.side_image_tag = None link

若非None,頭像會追蹤給定的圖像標籤(tag),而不是追蹤當前發言角色的關聯圖像。例如:

define e = Character("艾琳", image="eileen")

init python:
     config.side_image_tag = "eileen"

會讓頭像追蹤圖像標籤“eileen”。這個標籤與角色 e 關聯。

define config.side_image_only_not_showing = False link

當設置為True時,只在帶這個標籤的某個圖像還沒有顯示在界面上,才會顯示頭像。

define config.side_image_prefix_tag = ‘side’ link

搜索頭像使用的前綴。

define config.side_image_null = Null() link

不顯示頭像時,顯示空的可視組件。空的頭像也可以改變,只不過變為其他的空可視組件。一個這樣做的原因是,設置了空組件的邊界後(例如,Null(width=200, height=150)),能夠防止dissolve效果被中途割裂。

define config.side_image_same_transform = None link

若非None,當新的頭像與前一個頭像共享同一個圖像標籤時,這個transform就會使用。

define config.side_image_change_transform = None link

若非None,當新的頭像與前一個頭像不共享圖像標籤(或新舊頭像之一不存在)時,這個transform就會使用。

變換和轉場 link

config.side_image_same_transformconfig.side_image_change_transform 使用兩個參數——新舊兩個頭像可視組件——調用時,每次顯示的圖像。可以是讓頭像運行或者使用轉場效果。

下面是一個例子,當關聯圖像改變時,讓頭像滑入和滑出:

transform change_transform(old, new):
    contains:
        old
        yalign 1.0
        xpos 0.0 xanchor 0.0
        linear 0.2 xanchor 1.0
    contains:
        new
        yalign 1.0
        xpos 0.0 xanchor 1.0
        linear 0.2 xanchor 0.0

define config.side_image_change_transform = change_transform

角色不變的情況下,新舊頭像的轉場使用dissolve效果。(例如,角色改變情緒時。)為了讓Dissolve效果正常工作,兩個頭像必須有相同的尺寸。

transform same_transform(old, new):
    old
    new with Dissolve(0.2, alpha=True)

define config.side_image_same_transform = same_transform

預留空間 / 訂製化 link

默認情況下,對話文本區域的寬度與整個界面寬度相同。如果嘗試直接顯示頭像,圖像會覆蓋在文本上面。要修復這個問題的話,我們需要在文本窗口內劃出一塊合適的區域使用頭像。

style window:
    left_padding 150

通過訂製 saynvl 界面可以改變頭像的位置。兩種界面都需要包含這樣一行:

add SideImage() xalign 0.0 yalign 1.0

通過修改xalign和yalign特性(property),我們可以控制界面上頭像的顯示位置。

最後, SideImage() 會返回一個可視組件,也就是當前的頭像。這可以用在高級界面訂製化中。

相關函數 link

renpy.get_side_image(prefix_tag, image_tag=None, not_showing=True, layer='master') link

這個函數嘗試找到圖像顯示為頭像。

由某個圖像屬性(attribute)的集合決定啟用哪個頭像。如果給出了 image_tag ,函數從這個圖像標籤(tag)得到圖像屬性(attribute)。否則,函數從當前顯示的角色獲取圖像屬性。

然後函數會根據標籤 prefix_tag 和其他一些屬性尋找合適的圖像,並返回找到的圖像。

如果 not_showing 的值為True,這個函數將只返回一個頭像,前提是圖像使用的屬性(attribute)不存在於當前界面上。 如果 not_showing 的值為None,則根據 config.side_image_only_not_showing 的配置決定。

如果 layer 的值是None,當前顯示的圖像標籤使用默認圖層。

renpy.set_tag_attributes(name, layer=None) link

當對應標籤的圖像不在顯示時,該函數會將圖像屬性(attribute)與標籤進行關聯。 該函數的主要用途是,直接設置頭像所使用的圖像屬性。

例如:

$ renpy.set_tag_attributes("lucy mad")
$ renpy.say(l, "I'm rather cross.")

l mad "I'm rather cross."

是等效的。