頭像
許多視覺小說會在角色發言時,在對話內容旁邊顯示一張該角色的頭像。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_transform 和
config.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."
是等效的。