为 Mod 增加资源
# 为 Mod 增加资源与角色
今天我们学习的内容会有一点点的难,但是不必担心,按照教程走,你肯定会很快学会。
警告!!!
本章会默认您在使用 Mod 模板。
一般来说,在您的 Mod 工程里的 game
文件夹下会有一个名叫 mod_assets
的文件夹,这里面存放的就是 Mod 资源。
# 获取资源
您可以从 DDMC Community Assets(来自 Google Drive,需挂梯) (opens new window) 下载一些适合 DDLC Mod 的免费资源。
警告!!!
请注意资源的版权问题。 上面的文件夹(也包含其他来源)的大部分资源如果要使用,通常只要求在 Mod 里标注作者,但某些资源需要获得原作者的允许后才能添加到您的 Mod 里。
# 定义角色
有时候,我们可能需要增加一些其他的角色来丰富剧情。所以,我们现在就来动手添加一个角色吧。
Next 分支 / Future 分支:
- 打开 definitions.rpy 或 definitions/definitions.rpy 文件,然后 Ctrl+F 查找
# 角色变量
,找到下面的代码:
## 角色变量
# This is where the characters are declared in the mod.
# To define a new character with assets, declare a character variable like in this example:
# define e = DynamicCharacter('e_name', image='eileen', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
# To define a new character without assets, declare a character variable like this instead:
# define en = Character('Eileen & Nat', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
define narrator = Character(ctc="ctc", ctc_position="fixed")
define mc = DynamicCharacter('player', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
define s = DynamicCharacter('s_name', image='sayori', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
define m = DynamicCharacter('m_name', image='monika', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
define n = DynamicCharacter('n_name', image='natsuki', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
define y = DynamicCharacter('y_name', image='yuri', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
define ny = Character('夏树和优里', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
- 复制这一行:
define s = DynamicCharacter('s_name', image='sayori', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
- 然后换行并粘贴,把
s
改成任意字符,如a
;括号后的's_name'
改成之后要用的变量名,如'a_name'
; - Ctrl+F 查找
default s_name = "纱世里"
,复制换行并粘贴,把s_name
改成你前面输入的变量名。 比如,前面我们把括号后的变量名改成了a_name
,那么这一步这里的s_name
就要改成a_name
。 - 把
"纱世里"
改成你想要的名字,比如这里改成"Allen"
。
到这里,一个角色就定义完成了!最后的代码应该长这样:
# 角色变量
# This configure the character variables for writing dialog for each character
## To define a new character with assets, do so like this
# define e = DynamicCharacter('e_name', image='eileen', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
## To define a new character without assets, do so like this
# define en = Character('Eileen & Nat', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
define narrator = Character(ctc="ctc", ctc_position="fixed")
define mc = DynamicCharacter('player', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
define s = DynamicCharacter('s_name', image='sayori', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
define m = DynamicCharacter('m_name', image='monika', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
define n = DynamicCharacter('n_name', image='natsuki', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
define y = DynamicCharacter('y_name', image='yuri', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
define ny = Character('夏树 & 优里', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
define a = DynamicCharacter('a_name', what_prefix='"', what_suffix='"', ctc="ctc", ctc_position="fixed")
# ...
# Default Name Variables
## To define a default name do so like this
# default e_name = "Eileen"
default s_name = "纱世里"
default m_name = "莫妮卡"
default n_name = "夏树"
default y_name = "优里"
default a_name = "Allen"
在之后的章节里,本文档会详细讲解如何为 Mod 增加资源(包含增加立绘),而以后会继续教您怎么扩展这个角色。
# 增加资源
要使用资源,首先得增加资源。
# 增加图像资源
在 DDLC 里,图像资源分为两种:角色图像资源与背景图像资源。
注意!!!
角色图像资源的格式应该为 PNG,且背景应该是透明的。角色图像资源的分辨率应为 960x960 以保证兼容性。
背景图像资源的格式可以为 PNG 或 JPG。如果您自己创作了这种资源,我们强烈建议使用 PNG 格式。
背景图像的分辨率应该为 1280x720,否则图片会意外放大。如果背景图片的分辨率超过上述分辨率,至少您的图片也应该为 16:9 的尺寸,这种情况下可以使用下方示例代码解决缩放问题:
image your_image_name:
"path/to/your/image.png"
size (1280,720) # 添加 size 属性
为了兼容性,强烈建议您保证您新建的所有文件(夹)名称全部为小写,且不使用中文。
# 增加角色图像资源
- 在
mod_assets
文件夹下新建一个文件夹,取名为images
(如果没有)。 - 在
images
文件夹下新建一个文件夹,取名为<角色小写英文名>
(如果没有)。 - 在
<角色名>
文件夹里存放您的图像资源。 例如为纱世里增加面部表情资源,只需要把资源复制到sayori
文件夹里并重命名为 26 个字母中的任意一个(为了兼容性,但请不要与原版游戏冲突),然后这些资源在生成 Mod 时就会和 Mod 一并打包了。 - 在
definitions.rpy
文件里定义添加的资源。(本节后面会教您怎样这样做。)
注意!!!
请根据 <>
里的内容更改。
为了兼容性,强烈建议您保证您在此步新建的所有文件(夹)名称全部为小写,且不使用中文。
# 增加背景图像资源
- 在
mod_assets
文件夹下新建一个文件夹,取名为images
(如果没有)。 - 在
images
文件夹下新建一个文件夹,取名为bg
。 - 在
bg
文件夹里存放背景资源。 例如新增一个学园祭时的文学社教室背景,只需要把背景复制到bg
文件夹里并重命名为合适的名字,背景在生成 Mod 时就会和 Mod 打包在一起了。 - 在
definitions.rpy
文件里定义添加的资源。(本节后面会教您怎样这样做。)
# 增加音频资源
注意!!!
Ren'Py 只支持以下几种音频格式:
- Opus
- Ogg Vorbis
- MP3(不建议使用)
- WAV (16 位 PCM 格式的带文件头音频)
- 在
mod_assets
文件夹下新建一个文件夹,取名为audio
。 - 在
audio
文件夹里存放音频资源。 例如增加一首新的背景音乐,只需要把音频复制到audio
文件夹中就可以了。现在新增的音频在生成 Mod 时就会和 Mod 一并打包了。 - 在
definitions.rpy
文件里定义添加的资源。(本节后面会教您怎样这样做。) - 根据音频的特点在
definitions.rpy
文件里定义添加的音频。(本节后面会教您怎样这样做。)
# 定义资源
为了使用资源,还需要定义资源。
注意!!!
此步是最重要的一步,请认真跟着教程进行操作。如果哪一步出错了,可能会导致资源无法使用,甚至会使 Mod 无法运行!
# 定义图像资源
定义图像资源分为两种:定义角色图像资源与背景资源。
# 定义角色图像资源 / 立绘
打开
definitions.rpy
文件复制粘贴一行立绘定义:
针对已有角色:
按 Ctrl+F,查找资源关联的角色的小写英文名。 例如之前增加了纱世里的资源,那么在这一步就需要查找
sayori
。复制一行,在该角色的立绘定义区域的最底部重复任意一行已有的定义。 例如我复制了
image sayori 1 = im.Composite((960, 960), (0, 0), "sayori/1l.png", (0, 0), "sayori/1r.png", (0, 0), "sayori/a.png")
,那么就需要在最后一行,也就是image sayori 1y = im.Composite((960, 960), (0, 0), "sayori/1l.png", (0, 0), "sayori/1r.png", (0, 0), "sayori/y.png")
的下一行粘贴它。
针对新角色:
从已有的立绘定义代码中复制一行(代码例子看上面)。
在文件的最后再加一行,并粘贴刚刚复制的代码。
按照以下格式更改刚刚粘贴的那行代码:
如果是增加表情:
image <角色名> <立绘编号> = im.Composite((960, 960), (0,0), "<角色名>/<部分身体1>.png", (0,0), "<角色名>/<部分身体2>.png", (0,0), "mod_assets/images/<角色名>/<表情编号>.png")
如果是增加身体部分:
image <角色名> <立绘编号> = im.Composite((960, 960), (0,0), "mod_assets/images/<角色名>/<部分身体1>.png", (0,0), "mod_assets/images/<角色名>/<部分身体2>.png", (0,0), "<角色名>/<表情编号>.png")
如果都增加了:
image <角色名> <立绘编号> = im.Composite((960, 960), (0,0), "mod_assets/images/<角色名>/<部分身体1>.png", (0,0), "mod_assets/images/<角色名>/<部分身体2>.png", (0,0), "mod_assets/images/<角色名>/<表情编号>.png")
注意!!!
更改时需要注意以下四点:
- 所有角色名都应为小写。
- 请根据
<>
里的内容更改。 - 立绘编号不能和已有的立绘编号重复。
- 所有图像资源必须存在。
例如之前为纱世里加入了额外的资源,它是一个面部表情,并且名为
a.png
,根据这些就应该将代码更改为:image sayori 1ma = im.Composite((960, 960), (0,0), "sayori/1l.png", (0,0), "sayori/1r.png", (0,0), "mod_assets/images/sayori/a.png")
此处立绘编号取为
1ma
以便与原版立绘区分。(这里的m
指mod
)
现在,只需要在脚本里加入 show sayori 1ma
就能显示出纱世里的新表情了。
# 定义背景资源
打开
definitions.rpy
文件按 Ctrl+F 查找
# 背景
复制含有
image
的一行,然后粘贴在下一行。按以下格式更改刚刚粘贴的代码:
image bg <背景编号> = "mod_assets/images/bg/<包含扩展名的背景名全称>"
注意!!!
更改时需要注意以下三点:
- 请根据
<>
里的内容更改。 - 背景编号不能和已有的背景重复。
- 图像必须存在。
例如之前添加了一张学园祭时的文学社背景,且图像文件名为
clubroom_festival.png
,就应该更改为:image bg clubroom_festival = "mod_assets/images/bg/clubroom_festival.png"
- 请根据
现在,只需要在脚本里加入 scene clubroom_festival
就能显示新背景了。
# 定义音频资源
打开
definitions.rpy
文件按 Ctrl+F 查找
audio
复制开头带有
audio
的一行,然后粘贴在下一行。按以下格式更改刚刚粘贴的代码:
define audio.<音频编号> = "mod_assets/audio/<包含扩展名的音频全称>"
注意!!!
更改时需要注意以下三点:
- 请根据
<>
里的内容更改。 - 音频编号不能和已有的音频编号重复。
- 音频必须存在。
例如之前增加了一首学园祭背景音乐,就应该更改为:
define audio.tm1 = "mod_assets/audio/clubday_festival.ogg"
- 请根据
现在,只需要在脚本里加入 play music tm1
就能播放新音乐了。
扩展知识
Ren'Py 支持节选播放音频。在官方文档是这样介绍的:
Ren’Py支持节选播放音频文件。节选播放的语法是,在play语句的文件名之前,加上用英文尖括号<>包含的播放起始点。节选播放规范应该包含成对属性名和属性值,并用空格分隔。
属性值以秒为单位,集成在文件名前面的英文尖括号<>内。三种属性名分别为:
from
指定播放文件的起始时间点。(默认值为0.0秒)
to
指定播放文件的终止时间点。(默认值为文件结束。)
loop
指定需要循环播放的文件起始和终止时间点。(默认的起始时间点为文件开头或
from
指定的时间点。)
例如要让学园祭的背景音乐在播放完后循环回到 3.55 秒,刚刚的代码就可以改为:
define audio.tm1 = "<loop 3.55>mod_assets/audio/clubday_festival.ogg"
再例如要让学园祭的背景音乐播放 5 秒到 10 秒的内容,刚刚的代码就可以改为:
define audio.tm1 = "<from 5 to 10>mod_assets/audio/clubday_festival.ogg"