頭像

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

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

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

當某個角色發言時,Ren’Py會搜索並顯示該角色的頭像。顯示頭像遵守以下規則:

  • 圖像名帶有“side”標籤(tag)。

  • 發言角色有對應的圖像屬性(樣例中為“eileen”)。

  • 發言角色的頭像屬性盡可能多的匹配立繪屬性。

Ren’Py會根據以上規則搜索唯一圖像。若找到則用作頭像;如果沒有找到或找到多個圖像,則不顯示頭像。

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

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

image eileen happy = "eileen_happy.png"
image eileen concerned = "eileen_concerned.png"
image eileen space suit = "eileen_space_suit.png"

image side eileen happy = "side_eileen_happy.png"
image side eileen = "side_eileen.png"
image side eileen space = "side_eileen_space.png"
image side eileen suit = "side_eileen_suit.png"

label start:

    show eileen happy

    e "我們這行稱作A點。"

    e concerned "而這行稱作B點。"

    e space suit "還有這行稱作C點。"

在A點,角色 e 正在發言,關聯的圖像標籤是“eileen”。當“eileen happy”圖像顯示時,圖像標籤“eileen”是必須包含的,而“happy”則不一定。我們尋找帶有“side”圖像標籤的圖像,以及盡可能多的屬性,能匹配到“side eileen happy”,最終顯示為頭像。

在B點,顯示的圖像是“eileen concerned”。圖像標籤“eileen”是必須包含的,而“concerned”則不一定。。我們尋找帶有“side”圖像標籤的圖像,以及盡可能多的屬性,能匹配到“side eileen”,因為不存在“side eileen concerned”圖像。

最後,在C點,顯示的圖像是“eileen space suit”。圖像標籤“eileen”是必須包含的,而“space”和“suit”則不一定。我們尋找帶有“side”圖像標籤的圖像,以及盡可能多的屬性,能匹配到“side eileen space”和“side eileen suit”。由於這個圖像擁有相同數量的屬性,Ren’Py不做進一步選擇,也就不顯示頭像。

不可視角色

另一個頭像的用處,是當用戶角色的對話內容,顯示一個頭像。做法是將某個圖像與角色關聯,然後使用帶圖形結構的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' 。"

配置和儲存區變數

有一些頭像的屬性由配置項控制。

_side_image_tag = None
define config.side_image_tag = None

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

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

define config.side_image_tag = "eileen"

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

define config.side_image_only_not_showing = False

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

_side_image_prefix_tag = None
define config.side_image_prefix_tag = 'side'

若 _side_image_prefix_tag不是None,其使用 config.side_image_prefix_tag 的設置。 前綴用於搜索搜索頭像。

define config.side_image_null = Null()

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

define config.side_image_same_transform = None

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

define config.side_image_change_transform = None

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

變換和轉場

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

SideImage() 縮小時,最好啟用 Dissolve() 的mipmap功能。

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

define config.side_image_same_transform = same_transform

相關函數

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

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

由某個圖像屬性(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)

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

例如:

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

l mad "I'm rather cross."

是等效的。