马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 BuErShen 于 2019-4-25 16:45 编辑
Ren'Py引擎从入门到放弃(3)——成功定义一个角色
世上无难事,只要肯放弃。
先吐槽一下你乎:上周写的《Ren'Py引擎从入门到放弃(支线1)——自定义开场画面》,被“建议修改”,理由是“违法违规”。emmmmmm……完全不知道哪里“违法违规”。虽然申诉了,但估计放出来还得花几天。好在是支线,不影响主线流程(自我安慰中)。
这是入门介绍的第三篇,主要内容是 角色(character) 和 对话(dialogue)。
第一个问题:为何要“定义”角色?
答:这个问题很重要,比“如何定义角色”更重要,所以我把它放在开头。
因为在视觉小说(Visual Novel)中,“角色”是唯一负责对话的对象实例(旁白 narration 也是一个“角色”),同时还可能带有图像(image)类的属性或功能。岔开说一句,这里说的图像类,包括最常见的 图像(image)、精灵(sprite)以及7.0新增的 层叠式图像(layered image),具体的功能特性我们后续再展开。
定义“角色”能够多·快·好·省地实现人物对话和图像显示等需求。
第二个问题:如何定义角色?
答:在入门的第二篇中,我们新创建工程的模板脚本中见到过这样一句:
[RenPy] 纯文本查看 复制代码 define e = Character("艾琳")
这就是一个角色的最小化定义。其中的“e”是一个变量,也可以看作是角色的别名。后面就可以直接使用“e”,来让角色“艾琳”开口说话:
[RenPy] 纯文本查看 复制代码 e "您已创建一个新的 Ren'Py 游戏。"
e "当您完善了故事、图片和音乐之后,您就可以向全世界发布了!"
每条 e+空格+字符串 形式的脚本就会在对话窗口中显示“艾琳”的一句话。
一般情况下,脚本中角色的每一段话都会导致对话窗口内容更新并暂停,需要一个鼠标点击事件(event)才能触发下一段话的内容。
角色对话内容可以进一步定制化,例如:
[RenPy] 纯文本查看 复制代码 define e = Character("艾琳", who_color="#c8ffc8", window_background="frame.png")
这样定义角色的话,名字的文本颜色是RGB #c8ffc8(一种淡绿色),角色对话窗口背景使用图片“frame.png”。详细的定制化项目请参考官方文档。
接下去的内容是重点——人物立绘。定义人物时可以加上一个图像标签(image tag):
[RenPy] 纯文本查看 复制代码 define e = Character("艾琳", image="eileen")
Ren'Py在处理带有图像标签的角色定义时,会自动搜索 game\images 目录下所有文件名满足“eileen *” 形式的图片文件(*是通配符),并与角色“e”关联。例如,在教程工程中,有3个以“eileen”开头的图片文件,分别是
[RenPy] 纯文本查看 复制代码 eileen concerned.png
eileen happy.png
eileen vhappy.png
图像标签都是eileen,后面的部分称作图像属性(attribute)。
角色图像的显示可以使用show语句(详细的内容我们后续会讲),也可以使用“角色名+图片属性(attribute)”的形式同时改变角色图像并显示对话文本。例如:
[RenPy] 纯文本查看 复制代码 define e = Character("艾琳", image="eileen")
label start:
show eileen happy
e "很高兴认识你。"
可以写成:
[RenPy] 纯文本查看 复制代码 define e = Character("艾琳", image="eileen")
label start:
e happy "很高兴认识你。"
成功偷懒,少写了12个字符和1个回车,舒服~
还有能更加偷懒的:独白模式(monologue mode)!简单来说,就是角色的对话内容放进成对的3个英文双引号中,用空行分割。例如:
“艾琳”同学就会指导你们如何从入门到女装(雾)。
[RenPy] 纯文本查看 复制代码 define e = Character("艾琳", image="eileen")
label start:
e """
学习Ren'Py第一步是看文档。
学习Ren'Py第二步是练习样例。
学习Ren'Py第三步是放弃。
或者……女装!
"""
第三个问题:还有什么其他的骚操作吗?
答:大部分对话内容的定制化都涉及到文本样式(style),非常枯燥……这里就不说了(毕竟我也不懂)。其他的嘛……有个功能值得注意——对话内容的前缀和后缀。
我们在定义角色时,可以传入两个参数:what_prefix 和 what_suffix 。例如:
[RenPy] 纯文本查看 复制代码 define e = Character("艾琳", what_prefix="呜嗯呜嗯", what_suffix="是也")
这样的话,角色的对话内容在开头会自动添加上“呜嗯呜嗯”(不包含引号),结尾会自动添加上“是也”(不包含引号)。这个功能可以为带有“口癖”的角色省下一些事。
当然,不可能仅仅这点小功能就被我单独拿出来当作骚操作的~前缀和后缀是支持字符串内插(interpolate)图片的!内插(interpolation)翻译成大白话就是说:表面上是个字符串,实际上根本不会显示或者显示为其他东西。
举例来说,我们有个雪花的图片,名叫 “snowflake.png”。开头先定义一个image:
[RenPy] 纯文本查看 复制代码 image end_pic:
"snowflake.png"
size (16, 16)
block:
rotate 0
linear 2.0 rotate 360
repeat
图像(image)定义以后会说的,如果我们都还没有放弃的话……
为了骚,我让这个雪花图片以“2秒1圈”的速度顺时针旋转。然后再定义角色的对话内容后缀:
[RenPy] 纯文本查看 复制代码 define e = Character("Eileen", what_suffix="{image=end_pic}")
然后,角色“e”的对话内容结尾都会有一个旋转的雪花图片了~
[RenPy] 纯文本查看 复制代码 label main_menu:
return
label start:
e "嗯哼~"
也可以使用别的图像,比如多帧图片、各种缓动函数加alpha渐变等。
好了,第三篇差不多可以结(fang)束(qi)了……
预告部分:下一篇应该是图像(image)定义。图像这个东西吧……单纯显示一张图片实在没多多少内容好说,如果要骚起来就不得不说ATL(Animation and Transformation Language),于是各种语法再说一下就……脑仁疼,想放弃……
“Ren'Py引擎从入门到放弃”系列教程 |