添加不同大小的小头像

2022/5/6

本节文档介绍如何添加小头像

官方文档参考资料:https://www.renpy.cn/doc/side_image.html

# 需求描述

在对话框的左下角添加人物小头像,如图青色方框圈出位置

需求描述

# 分析

解包本作的原版,你会发现这作并没有准备专门的小头像,小头像是由人物立绘缩小而成,在 cg 文件夹下,Yu-ris 引擎读取 cg/face 文件夹内的缩小头像(分辨率 375x679 像素)作为小头像,读取 cg/stand 文件夹内的图片作为立绘(分辨率 600x1086 像素)

可能会有人理解不了上面的是什么情况,这里我放四张图片帮助大家理解

位于 face 文件夹内用作对话框小头像的图片,该文件位置 ./cg/face/心愛/心愛_おやつ_基本_笑顔.png ,分辨率 375x679 像素

心爱小头像

位于 stand 文件夹内用作人物立绘的图片,该文件位置 ./cg/stand/心愛/心愛_おやつ_基本_笑顔.png ,分辨率 600x1086 像素

心爱立绘

另外,不同角色的立绘和小头像均大小不一,如下

位于 face 文件夹内用作对话框小头像的图片,该文件位置 ./cg/face/真冬/真冬_制服_基本_まったり.png ,分辨率 400x724 像素

真冬小头像

位于 stand 文件夹内用作人物立绘的图片,该文件位置 ./cg/stand/真冬/真冬_制服_基本_まったり.png ,分辨率 640x1158 像素

真冬立绘

# Ren'Py 原始实现

# 在 screen say(who, what): 函数下有类似以下代码
add SideImage() xalign 0.0 yalign 1.0 # 使用 SideImage() 方法添加小头像,x 轴位置 0.0,y 轴位置 1.0
1
2

# 表示位置的方法

关于这里 xalign 和 yalign 的简要说明,如图

坐标轴

淡蓝色标注的是屏幕,屏幕左上角是坐标轴起始点(0,0),向右是 X 轴正方向,向下是 Y 轴正方向

如何图片要想展示给玩家,就必须给定其在屏幕上的位置,表示方法有两种:坐标表示法相对位置表示法

本作移植版 GUI 采用 1920x1080 的分辨率(注意这个分辨率和你的显示器屏幕分辨率无关,引擎会自动缩放到合适大小),所以在刚才的坐标轴中,屏幕的右下角用坐标表示法就是(1920,1080),坐标表示法就是像数学中的坐标轴一样,先读 X 轴的精确数值,再读 Y 轴的精确数值

在使用坐标表示法时,不可以加上小数点,下面我们假设需要把小头像放在(20,1080)这个位置,我们应该这么写

add SideImage() xalign 20 yalign 1080
1

有人会说:“那我放每张图片都要计算像素,岂不是非常麻烦?”

是这样的,所以我们还可以使用相对位置表示法,同样是刚才的坐标轴,我们把屏幕在正方向最远处设为 1.0 ,那么,假设我们的把 GUI 设置为 1920x1080 的话,(1920,1080)这个位置就可以表示为:

xalign 1.0 yalign 1.0
1

再举一例,(960,540)就可以这样表示:

xalign 0.5 yalign 0.5
1

这样的方式更加方便,所以也更加常用,不过需要注意,使用相对位置表示法时,必须加上小数点

xalign 1 yalign 1 # 不加小数点是坐标表示法,图片会被放到(1,1)这个位置

xalign 1.0 yalign 1.0 # 假设 GUI 分辨率设置为 1280x720,那么这里就表示(1280,720)这个位置
1
2
3

# 注意事项

按照 Ren'Py 这里的原始设计方法,我们在制作 Galgame 时,必须单独设计小头像,并且头像文件大小应当一致,这样在这里调整这个参数就能把所有的头像全部放在统一的位置

# 修改代码

根据前面的分析,我们发现原作并不满足这里“注意事项”的要求,这会导致我们小头像的参数不能定死,所以我们需要一个变量来实现在运行中变换这一数值的目的

Ren'Py 里面提供了命名空间来存储这样的变量(不需要持久保存,在游戏运行中不断变化)

这里的实现是这样的

# 参考 ver1.0 screen.rpy 34-38行
init python in sideimagesize: # init python 初始化阶段运行,正常顺序加载 ## in sideimagesize 在命名空间 sideimagesize 中
    # 需要赋初始值
    SideImageXalign = 0.08 # SideImageXalign 横坐标 Xalign 的值
    SideImageYalign = -29.35 # SideImageYalign 横坐标 Yalign 的值
    SideImageZoom = 0.95 # SideImageZoom 图片缩放大小 Zoom 的值
1
2
3
4
5
6

这样,我们就创建了一个叫做 sideimagesize 的命名空间,接下来,我们来改造一下上面的 screen say(who, what): 方法

# 参考 ver1.0 screen.rpy 138-179行
# 里面还包含了不属于本节要讲的内容,请先略过这一部分
screen say(who, what):
    style_prefix "say"

    window:
        id "window"
        # 在这里从命名空间导入变量,记得需要在if判断体前完成哦,不过不能超出window部分
        # 2021年10月26日 下面这句居然开始报warning(store.sideimagesize,去store就好,但是跑不起来)了,但是store不能去,去了就炸
        # 开发使用Ren'py7.4.6,此时官网最新版为7.4.10,怀疑是新版改了些什么东西
        # 暂时不考虑升级最新版,但是由于这版在Win11视频解码存在问题,最终做完之后考虑上下最新版
        # 2022年1月28日 报warning 的问题应该是IDE插件的锅,现在没有了
        # 而解码实际上没有问题,应该只是W的电脑太菜了解不动2K->加入硬解就好了
        
        # 从命名空间导入变量的方法:$ import store.命名空间名称
        # 下面的 104 不知道咋加上去的,不需要
        $ import store.sideimagesize as sideimagesize104 # 这里的104可以删掉,没有实际意义,估计是什么时候 IDE 抽风了的原因

        if who is not None:

            window:
                id "namebox"
                style "namebox"
                text who id "who"

        # text what id "what"
        # if renpy.is_seen(ever = True) and persistent.lightRead: 这句在移动端似乎不起作用?
        # 已读未读文本不同颜色

        # 增加描边
        # https://www.renpy.cn/thread-278-1-1.html
        if renpy.is_seen(ever = True):  # ever 为false时对本次运行起效,此处需要对过去所有阅读起效
            text what id "what" color "#f9d198" # 标记颜色
        else:
            text what id "what" color "#FFFFFF" # 未读颜色


    ## 如果有对话框头像,会将其显示在文本之上。请不要在手机界面下显示这个,因为
    ## 没有空间。
    # 小头像的位置在这里调整 用zoom可以缩放图片
    ### if not renpy.variant("small"):
    ### add SideImage() xalign 0.0 yalign 1.0
    ### 针对大的 add SideImage() xalign 0.12 yalign 9.1 zoom 0.35

    if not renpy.variant("small"):
	# 重点关注这里的代码,把 xalign yalign zoom 的数值分别替换成了变量 ideimagesize.SideImageXalign ,sideimagesize.SideImageYalign , sideimagesize.SideImageZoom,这样我们就实现了小头像的动态位置调整
        add SideImage() xalign sideimagesize.SideImageXalign yalign sideimagesize.SideImageYalign zoom sideimagesize.SideImageZoom
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

# 调用

在切换人物的时候,调整该变量的值即可

# 参考 ver1.0 scene01 2090-2120行
	# 关注这里的代码
    # 这个语句是针对心爱设计的参数,能够调整心爱在对话框里面的位置
    $ sideimagesize.SideImageXalign = 0.10
    $ sideimagesize.SideImageYalign = 15.72 # 仍然是相对位置表示法,大于1.0时以1.0所在轴的数值做参考,比如这里的偏移位置就是 (1080x15.72=16977.6px),这里的数值可以通过多次调整参数测试出来
    $ sideimagesize.SideImageZoom = 0.96

    # 心爱 「そこじゃない!」附加:pac/怒り
    # 心爱小跳的动画
    hide 心愛_制服_基本_ぶわー
    show 心愛_制服_基本_不機嫌:
        # 可以关注这里的相对位置表示法
        zoom 1.5 # 图片缩放
        xalign 0.8918 # X 轴位置
        yalign -0.09 # Y 轴位置
        linear 0.15 yalign 0.02 # linear 时间 ,在这个时间内向指定位置移动
        linear 0.15 yalign -0.09
    voice "voice/心愛/cca_a1_0041.ogg"
    ai 心愛_制服_基本_不機嫌 "才不是那个呢!"
    hide 心愛_制服_基本_ぶわー

    # 关注这里的代码
    # 这个语句是针对真冬设计的参数,能够调整真冬在对话框里面的位置
    $ sideimagesize.SideImageXalign = 0.08
    $ sideimagesize.SideImageYalign = -29.35
    $ sideimagesize.SideImageZoom = 0.95

    # 真冬 「その代わり湯飲みあげるから」
    # hide 真冬_制服_基本_おやつ2
    show 真冬_制服_基本_おやつ3 at love69_left with dissolve
    voice "voice/真冬/maf_a1_0093.ogg"
    dong 真冬_制服_基本_おやつ3 "作为奶糖苹果的代替,喝杯茶吧"
    hide 真冬_制服_基本_おやつ2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34