头像 link

许多视觉小说会在角色发言时,在对话内容旁边显示一张该角色的头像。Ren’Py把这个头像称作头像(side image),并支持自动选择和显示对话的头像。

使用头像的前提是,定义 Character() 时使用一个关联的图像标签(tag):

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

当某个带有关联图像标签的角色发言时,Ren’Py会创建一个图像属性(attribute)池。关联图像标签会被添加到这个池,当前图像属性与那个图像标签关联。

根据图像标签选择关联的头像时,Ren’Py会尝试在图像属性池中找到带有标签“side”且带有尽可能大的属性值的图片。如果没有找到符合条件的图片,或者找到多个带有相同属性值的图像,就显示 Null

除了tag标签,在属性池中至少需要有一项属性。如果没有,头像不会显示。

例如,假设我们有如下脚本:

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

有一些头像的属性由配置项控制。

_side_image_tag = None link
define config.side_image_tag = None link

若非None,头像会追踪给定的图像标签(tag),而不是追踪当前发言角色的关联图像。例如:

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

define config.side_image_tag = "eileen"

会让头像追踪图像标签“eileen”。这个标签与角色 e 关联。

define config.side_image_only_not_showing = False link

当设置为True时,只在带这个标签的某个图像还没有显示在界面上,才会显示头像。

_side_image_prefix_tag = None link
define config.side_image_prefix_tag = 'side' link

若 _side_image_prefix_tag不是None,其使用 config.side_image_prefix_tag 的设置。 前缀用于搜索搜索头像。

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

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

相关函数 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."

是等效的。