許多視覺小說會在角色發言時,在對話內容旁邊顯示一張該角色的頭像。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不會顯示它。
另一個頭像的用處,是當用戶角色的對話內容,顯示一個頭像。做法是將某個圖像與角色關聯,然後使用帶圖形結構的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' 。"
頭像有一些變換,分別由一些配置項控制。
config.side_image_tag
= None link若非None,頭像會追蹤給定的圖像標籤(tag),而不是追蹤當前發言角色的關聯圖像。例如:
define e = Character("艾琳", image="eileen")
init python:
config.side_image_tag = "eileen"
會讓頭像追蹤圖像標籤“eileen”。這個標籤與角色 e
關聯。
config.side_image_only_not_showing
= False link當設置為True時,只在帶這個標籤的某個圖像還沒有顯示在界面上,才會顯示頭像。
config.side_image_prefix_tag
= ‘side’ link搜索頭像使用的前綴。
config.side_image_null
= Null() link不顯示頭像時,顯示空的可視組件。空的頭像也可以改變,只不過變為其他的空可視組件。一個這樣做的原因是,設置了空組件的邊界後(例如,Null(width=200, height=150)),能夠防止dissolve效果被中途割裂。
config.side_image_same_transform
= None link若非None,當新的頭像與前一個頭像共享同一個圖像標籤時,這個transform就會使用。
config.side_image_change_transform
= None link若非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
角色不變的情況下,新舊頭像的轉場使用dissolve效果。(例如,角色改變情緒時。)為了讓Dissolve效果正常工作,兩個頭像必須有相同的尺寸。
transform same_transform(old, new):
old
new with Dissolve(0.2, alpha=True)
define config.side_image_same_transform = same_transform
默認情況下,對話文本區域的寬度與整個界面寬度相同。如果嘗試直接顯示頭像,圖像會覆蓋在文本上面。要修復這個問題的話,我們需要在文本窗口內劃出一塊合適的區域使用頭像。
style window:
left_padding 150
通過訂製 say
和 nvl
界面可以改變頭像的位置。兩種界面都需要包含這樣一行:
add SideImage() xalign 0.0 yalign 1.0
通過修改xalign和yalign特性(property),我們可以控制界面上頭像的顯示位置。
最後, SideImage()
會返回一個可視組件,也就是當前的頭像。這可以用在高級界面訂製化中。
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."
是等效的。