使用Renpy引擎打造Nvl游戏 (二):角色,图像,音频详解
本文最后更新于 44 天前,如有失效请评论区留言。

参考文档:
renpy官方文档:https://doc.renpy.cn/zh-CN/dialogue.html#character
使用Renpy引擎打造Nvl游戏 (二):角色,图像,音频详解

前言

在第一章的学习中,我们已经安装了renpy,并进行了初步的认识。
这一节爱丽丝来讲讲角色,图像,音频的引用。
其实这一章大多部分是来自于官方文档,爱丽丝只是提炼了一些比较重要的,删去了一些用的少的东西,如果想更加透彻地了解,建议访问官方文档。

正式开始

角色

在Renpy中,通过创建一个角色对象并在say语句中使用该角色对象,你可以定制化对话窗口外观(甚至行为)。角色对象通过使用define语句,将角色(character)声明为一个变量。

define e = Character("爱丽丝")

完成了这步工作后,定义的角色就可以使用在say语句中。例如:

e "欢迎来到SuBlog!!!"

定义ADV和NVL模式

Character可以定义更多的东西,比如kind,image等等。
举个例子,我们可以定义ADV模式:

define e = Character("爱丽丝", kind=adv)

这样我们显示的界面就是如下的:


或者我们可以使用定义NVL模式:

define e = Character("爱丽丝", kind=nvl)

这样我们显示的界面就是如下的:

带有图像属性(attribute)的say语句

当一个角色与一个图像标签(tab)关联,包含对应角色的say语句将在角色名和第二个字符串之间就可以插入图像属性(attribute)。

在这中情况下,如果带有给定标签(tag)的某个图片需要显示,Ren’Py会定位一条包含角色标签(tag)和属性(attribute)的show命令。如果图片未显示,Ren’Py会保存属性(attribute)并用于头像,但依然不会显示图片。

举例:

define e = Character("爱丽丝", image="SuBlog")

label start:

    show SuBlog mad
    e "我对你有点失望。"

    e happy "我们好好过日子吧。"

等价于:

define e = Character("爱丽丝")

label start:

    show  SuBlog mad
    e "我对你有点失望。"

    show SuBlog happy
    e "我们好好过日子吧。"

在上面的例子中,mad 和 happy 会互相替换。 不过也可以可以直接从 happy 恢复而不用指定 mad 属性。 办法是使用减号(-)
举例:

define e = Character("爱丽丝")

label start:

    show SuBlog
    e mad "我们分手吧。"

    e happy "但是我还是喜欢你。"

    e -happy "我们继续交往吧!"

一些其他Character用法

参考Renpy的官方文档,具体用法如下:
name
如果该参数是一个字符串,则成为对话中角色的名字。如果 name 参数是 None ,名字不会显示,用于旁白。

kind
新建角色的基底角色。当使用该参数时,新建角色没有显示赋值的参数,均使用对应基底角色的属性作为默认值。这个设计常用来定义模板(template)角色,然后继承模板角色属性并修改。

链接图片 与某个角色关联的图像标签(tag)名。这种设计,允许一个包含角色的say语句使用标签(tag)名来展现角色图片,也同时允许角色说话时Ren’Py自动选择并展现一个头像。

image
与角色关联的图像标签(tag)名的字符串。

语音标签(tag) 若某个声音标签(tag)被指定为某个角色所有,标签下对应的声音文件将会与该角色关联,这些声音文件可以在自定义设置界面被静音或者被播放。

voice_tag
voice_tag是一个字符串,在“voice”频道内可以voice_tag可以控制关联角色声音文件的静音或者播放。

前缀和后缀 这个设计允许在角色名字或者展现文本上添加前缀和后缀。前缀和后缀可以用在每一行对话的前后添加引用内容。

what_prefix
显示对话内容之前,添加的前缀字符串。

what_suffix
显示对话内容之前,添加的后缀字符串。

who_prefix
显示角色名字之前,添加的前缀字符串。

who_suffix
显示角色名字之前,添加的后缀字符串。

改变角色显示名 该可选项用于控制显示角色名。

dynamic
该参数若为True,角色名 name 应是一个包含python表达式的字符串。该字符串会在每行对话执行前先演算,将演算结果用作角色名。

互动控制 这些可选项在“对话展示、发生互动、模式输入”情况下控制显示效果。

condition
若给定,该参数应是一个包含python表达式的字符串。若表达式结果为False,对话不会发生,即say语句不会执行。

interact
若该值为True,默认情况下无论对话何时被展现,都会发生一项互动。若该值为False,则互动不会发生,而一些额外元素可以被添加到界面上。

advance
若该值为True,默认情况下用户可以快进语句执行,还有一些其他的快进方式(比如跳过skip和auto-forward mode自动前进模式)也将生效。若该值为False,用户不能跳过say语句,除非脚本中出现某些替换方法(比如跳转超链接)。

mode
该参数是一个字符串,给定了角色发言时进入的模式(mode)。详见 模式(mode) 章节。

callback
角色发言时,若有事件(event)发生则会被调用的函数。详见 角色(character)回调(callback) 章节。

点击继续 “点击继续”提示是在(一段内容)所有文本均已展示完的情况下,通常出现一次,提醒用户进入下一部分内容。

ctc
一个用做“点击继续”提示的可展现部件,若有其他特殊提示被使用时可能不会展现。

ctc_pause
当文本显示被{p}或{w}标签(tag)暂停时,用作“点击继续”提示的一个可视组件。

ctc_timedpause
当文本显示被{p=}或{w=}标签(tag)暂停时,用作“点击继续”提示的一个可视组件。当该值为None时,会使用 ctc_pause 的值作为默认值。若你想要使用 ctc_pause 而不是 ctc_timedpause ,请使用 Null() 。

ctc_position
该参数控制“点击继续”提示的位置。若值为 "nestled" ,该提示会作为目前展示文本的一部分出现,在最后一个字符显示后立即出现相应提示。若值为 "fixed" ,提示会被直接添加到界面上,其在界面上的位置由位置样式属性控制。

界面 显示对话使用到一个 界面 。该入参允许你选择界面(screen),并传入参数。

screen
显示对话时使用的界面名。

关键词参数以前缀 show_ 开头,去掉前缀后传参给界面(screen)。例如, show_myflag 的值会改为变量 myflag 并传参给界面(screen)。(myflag变量并不是默认会用参数,但可以被一个定制对话界面使用。)

鉴于某些历史原因,show系列变量由Ren’Py引擎处理:

show_layer
若给定了这个参数,其应该是一个字符串,这个字符串给定了展现“说话”界面所在图层的名字。

样式化文本和窗口 以 who 、 what 和 window_ 开头的关键词参数,会去掉前缀后分别用于 样式 角色名、对话文本和窗口内容。

例如,若一个角色被给定了关键词参数 who_color="#c8ffc8" ,角色名的颜色就被改变,这里的例子中会被改成绿色。 window_background="frame.png" 是把包含该角色的对话窗口背景设置为图片frame.png。

应用于角色名、对话文本和窗口的样式化,也可以使用这种方式进行设置:分别对应使用 who_style , what_style 和 window_style 参数。

设置 config.character_idprefixes 后,就可以样式化其他可视组件了。例如,如果使用了默认的GUI配置,带有前缀 namebox 的样式将会应用在发言角色名上。

显示图像

若要定义出视觉小说的重点,通过其名字就能得到,重点是“视觉”。Ren’Py中,提供了4种语句用于控制图像显示,并提供了一种模式用于控制图像显示顺序。这些特性可以使视觉小说和叙事性游戏中,合理展示图像变得十分方便。

与图像相关的4种语句分别是:

image – 定义一个新的图像(image)。

show – 在图层上(layer)显示一个图像。

scene -清空图层(layer),并可选是否在那个图层上显示一个图像。

hide – 将图层(layer)上的某个图像移除。

图像的突然变化显得很突兀,Ren’Py提供了 with 语句,可以在场景切换时提供各种效果。

图像(image)

图像(image)是可以使用show语句显示在界面上的一类东西的统称。图像(image)由一个名称和一个可视组件构成。当某个图像展示在某个图层上时,也表示那个图像关联的可视组件显示在图层上。

一个 图像名称 可能包含一个或更多字段,由空格分隔。图像名称的第一个字段称作 图像标签(tag)。 后面的字段被称作 图像属性(attribute)。

举例来说,假设图像名称为 mary beach night happy 。图像标签就是 mary ,而图像属性(attribute)就是 beach 、 night 和 happy 。

可视组件是可以展现在界面上的一类东西的统称。最常用来展现的是静态图像,只需要以字符串形式给定图片文件名称就可以使用了。在上面的样例中,我们可以使用 mary_beach_night_happy.png 这样的文件名 除了静态图片之外,图像(image)可以使用 Ren’Py支持的所有可视组件 。 用于显示图像的语句也可以用来显示动画、纯色和其他可视组件。

图层(layer)

图层是一个可以显示在界面上的可视组件列表。Ren’Py支持多图层,包括使用自定义图层。图层(layer)的顺序在游戏内设置(被 config.layers 变量控制), 而图层内可视组件的顺序由scene和show语句的顺序及语句中的特性(property)共同决定。

以下图层由Ren’Py内部定义:

master
该图层是在scene、show和hide语句中默认使用的图层。master图层主要用于背景和角色精灵(sprite)。

transient
UI函数使用的默认图层。在每次互动结束后,该图层都会被清空。

screens
该图层用于界面系统。

overlay
当UI函数被覆盖(overlay)函数调用时,默认使用的图层。当一个互动行为重新启动时,该图层会被清空。

若需要定义新的图层,可以调用 renpy.add_layer() 函数,并设置图层相关 配置项。 使用 camera statement,时,一个图层可以同时应该多个变换。

定义图像(image)

有两种定义图像(image)的方式。你可以将图片文件放在images目录里,或者使用image语句定义一个图像(image)。图像的定义格式比较简单,只要放入目录中的图片文件命名符合转换规则,就能直接转换为图像并使用,还允许使用非图像文件定义图像。

使用image语句的优先级高于通过image目录定义的图像。

图像目录

图像目录名为“images”,放置在game目录下。当一个扩展名为.jpg、.jpeg、.jxl、.png或.webp的文件被放入这个目录时,文件的扩展名会被忽略,文件名的其余部分强制转为小写,最终生成的文件名会被用作图像(image)的名称,前提是那个名称没有在之前其他地方被显示定义过。

这种设计会处理所有images目录下的子目录。例如,以下所有文件都会被定义为图像(image) alice happy

game/images/alice happy.png
game/images/Alice Happy.jpg
game/images/alice/alice happy.png

image语句

image语句用于定义图像(image)。一条image语句由以下部分组成:以关键词 image 开头的一条逻辑行,后接一个图像名,一个等号(=)和一个可视组件。举例:

image alice happy = "alice_happy.png"
image black = "#000"
image bg tiled = Tile("tile.jpg")

image alice happy question = VBox(
    "question.png",
    "alice_happy.png",
    )

音频

Ren’Py支持在后台播放音乐和音效,支持的音频文件格式如下:

Opus

Ogg Vorbis

MP3

MP2

FLAC

WAV (未压缩的有符号16bit型PCM编码格式)

在Web浏览器上,Ren’Py会检查一个音频格式列表,并根据浏览器支持的格式启用一个更快更少卡顿的模式。 如果你的游戏只是用mp3,而且不考虑Safari浏览器,可以直接修改 config.webaudio_required_types 的值。

Ren’Py支持任意数量的音频通道。有三种一般音频通道是默认定义好的:

music – 音乐播放通道。

sound – 音效播放通道。

voice – 语音播放通道。

通用通道支持音频的播放和音频队列,但同一时间只能播放1个音频文件。可以使用 renpy.music.register_channel() 函数注册新的通用通道。

游戏内自定义配置菜单中的“音乐音量”、“音效音量”和“语音音量”设置的值,会应用于以上对应的音频通道。详见 音量 。

另外,除了通用通道,还存在特殊音频通道 audio 。audio通道支持同时播放多个音频文件,但不支持队列播放和中途停止。

音效的用途,包括按钮(button)、菜单选项、图片地图(imagemap)的鼠标悬停和激活状态。详见 按钮样式属性. 两个配置项, config.main_menu_music 和 config.game_menu_music ,分别对应主菜单和游戏菜单播放的音乐。

游戏内播放音乐和音效的常用办法,是使用Ren’Py的三种音乐/音效语句。

play语句

play 语句用于播放音效和音乐。如果某个文件正在通过通用通道播放,播放会被中断,并开始播放新的文件。

音频通道名(通常就是“sound”、“music”、“voice”或者“audio”)需要跟在关键词 play 后面。通道名后面是音频文件。音频文件可以是单个文件,也可以是文件列表。如果是文件列表的话,列表内元素顺序播放。

fadein 和 fadeout 分句是可选的。 fadeout指定了正在播放音乐需要停止时的淡出时间,单位为秒。fadein指定了播放新音乐的开头淡入时间。如果没有fadeout时间没有指定,就使用 config.fadeout_audio 的配置值。

loop 和 noloop 分句也是可选的。 loop分句表示音乐循环播放,noloop分句表示音乐只播放一次。如果这两个分句都没有出现,根据通道的默认配置决定实际播放情况。

play music "mozart.ogg"
play sound "woof.mp3"
play myChannel "punch.wav" 
# 'myChannel'需要先使用renpy.music.register_channel()定义。

"我们也可以播放一个音效或音乐的列表。"
play music [ "a.ogg", "b.ogg" ] fadeout 1.0 fadein 1.0

stop语句

stop语句以关键词 stop 开头,后面跟需要静音的音频通道名。最后有一个可选的 fadeout 分句。 如果没有fadeout时间没有指定,就使用 config.fadeout_audio 的配置值。

stop sound
stop music fadeout 1.0

queue语句

queue 语句用于组建音频文件队列。当前播放的文件被播放完毕之后,queue语句组建的音频文件队列就会开始播放。

queue语句以关键词 queue 开头,后面跟播放使用的音频通道名。最后是否带 fadein 、 loop 或 noloop 分句是可选的。

queue sound "woof.mp3"
queue music [ "a.ogg", "b.ogg" ]

小结

这一章大多部分是来自于官方文档,爱丽丝只是提炼了一些比较重要的,删去了一些用的少的东西,如果想更加透彻地了解,建议访问官方文档。

版权声明:除特殊说明,博客文章均为爱丽丝(Iris)原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇