马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 BuErShen 于 2019-4-25 16:45 编辑
Ren'Py引擎从入门到放弃(4)——图像、图层以及4个常用语句
世上无难事,只要肯放弃。
终于要谈图像了……
“A visual novel isn't much of a visual novel without pictures.”没有图片就不要搞什么视觉小说了,直接写网文或者轻小说就行了。如果有人想写的话,我倒是知道平台……咳咳,扯远了。这是入门介绍的第四篇,主要内容是图像的基础部分。
第一个问题:如何定义图像(image)?
答:定义图像(image)的方法有两种:
- 把图片文件(png 和 jpg格式)放入 images目录。
- 在脚本中使用图像定义语句。
第一种方法的关键在于:图片文件的命名。去掉文件扩展名之后,图片名字符串强制转换为小写,字符串第一个空格前的子字符串就是图像的名称(也就是说不支持中文),如果没有文件名没有空格分隔则整个字符串就是图像名称。例如,我们请来了尼禄(?),图片名称为“nero normal.png”,直接放入image目录中(再次建议最好单独建一个character子目录专门放角色图片,甚至每个角色建立单独目录),在脚本中不需要任何定义就可以直接使用show语句显示:
[RenPy] 纯文本查看 复制代码 # show语句的用法在后面
show nero normal
效果如下:
Ren'Py会自动搜索所有在 images目录及其子目录下的图片资源,并根据图片文件名定义好图像(image)便于直接在脚本中使用。如果存在同名图片,则按照拉丁字母排序遍历整个目录结构后得到的顺序,使用最先匹配到的那张图。如果不能理解上一句话,就改为记住:“避免图片重名!”图片同名,但扩展名不同的也属于图片重名。图片名如果使用空格分隔成几个字段的话,第一个字段就表示图像标签(tag),后面的字段都表示图像属性(attribute)。图像标签和图像属性在后面的几个语句中会解释,主要作用是用来提(tou)效(lan)。
需要注意,只能使用空格来分隔图像标签跟图像属性,下划线是不行的。在官方文档中有一句:In the example above, we might use "mary_beach_night_happy.png" as the filename. 这句话有一些误导性。下划线分隔的文件名并不会自动识别为图像标签和图像属性字段。
图片文件命名的规则和标准非常重要。合理的命名方式能避免开发过程中的不少混乱和问题。所以放在开头说明。
然后是脚本内定义图像(image)。这里的图像仅仅是狭义的image,而不是范围更大的 可视组件(displayable)。定义图像很简单直接,使用image语句:
[RenPy] 纯文本查看 复制代码 # 定义角色图像
image nero normal = "images/charater/nero1.png"
使用这种方式定义的图像(image),文件名就可以随意……如果不想用Ren'Py自动识别 tag和 attibute的机制,就可以自定义文件名并使用image语句定义图像(image)。
同样的,还可以用来定义背景图:
[RenPy] 纯文本查看 复制代码 # 定义背景图像
image bg summon = "images/background/bg summon.png"
image语句还可以把一些图片合并起来使用,比如:
[RenPy] 纯文本查看 复制代码 image nero double = HBox(
"images/charater/nero normal.png",
"images/charater/nero normal.png",
)
我们就可以得到左右并排两个尼禄。啊~双倍的尼禄,双倍的快乐~
附带说明,纯色(solid)也可以使用image语句直接定义。特别是常用的全黑和全白,在转场之类的时候有用:
[RenPy] 纯文本查看 复制代码 image black = "#000"
image white = "#ffffff"
第二个问题:图像(image)相关的常用语句和语法有哪些?
答:常用的语句有4种,分别是:image、show、scene和hide。
- image用于定义图像,上面讲的最基础的定义方法。后续讲到ATL语言部分会进一步深入复杂的用法。
- show用于显示图像(image)。虽然实际使用时可以不写全所有的图像标签和图像属性字段,让Ren'Py根据固有规则自动匹配。建议还是写全,避免不必要的麻烦。
- scene用于清空图层,然后通常会加上一个图像名并显示出来,后面不带参数的情况下会清空图层(layer)上所有显示的图像。通常用在场景开头,清空原有图像并显示新的背景图。比如在开头:
[RenPy] 纯文本查看 复制代码 scene bg summon - hide用于隐藏图像。如果光显示而不隐藏的话,场景里所有角色都会挤在画面中,这种群口相声效果一般不是我们希望出现的。通常最多显示正在对话的两个角色就可以,其余的角色隐藏。
这里就出现了可以偷懒的知识要点(敲黑板)!一个角色的不同表情通常对应不同的图像,如果要切换角色表情的话,最朴素的办法是——每次先用hide语句隐藏当前图像然后用show语句显示新图像。比如,我们定义了图像 nero1 为普通表情的尼禄,定义了 nero2 为微笑表情的尼禄,应该这样写:
[RenPy] 纯文本查看 复制代码 show nero1
"嗯唔嗯唔。"
hide nero1
show nero2
"余很高兴!"
如果不隐藏 nero1,直接显示 nero2 的话,后者会直接覆盖在前者上。对角色立绘轮廓一样的情况,观感上看不出来。如果轮廓不一致的话,就……
如果同一个角色的不同图像具有相同的图像标签(tag)以及不同的图像属性(attribute)的话,可以不用hide语句直接show语句切换。比如我们拥有各种“nero ****”图片文件,对应的图像标签(tag)都是 nero 。这种情况下使用show语句,画面上只会显示一个带有相同tag的图像。show语句只需要关注不同的图像属性(attribute)就可以。例如(截图不放了):
[RenPy] 纯文本查看 复制代码 show nero normal
e "嗯唔嗯唔。"
show nero smile
e "余很高兴!"
show nero foolish smile
e "罗马!"
另外,还记得在上一篇里提到的使用“角色名+图片属性(attribute)”的形式同时改变角色图像并显示对话文本吗?不过那一篇的示例代码有点问题,第一次显示图像还是需要用show语句的……
所以,定义角色时写上图像标签(tag):
[RenPy] 纯文本查看 复制代码 define e = Character("尼禄", image="nero")
上面的代码可以进一步简化为:
[RenPy] 纯文本查看 复制代码 show nero normal
e "嗯唔嗯唔。"
e smile "余很高兴!"
e foolish smile "罗马!"
show 和 hide语句后面可以接上几个特性(property),详情请参考官方文档。at关键词后面可以带自定义的 变换(transform)。详细内容会在变换部分展开。
show、hide和scene语句后面可以接上 with分句,后面带转场(transition)效果。详细内容会在转场部分展开。(当然,那两部分内容什么时候写是完全不确定的。切勿催更,越催越慢,再催放弃……)
第三个问题:图层有哪些?分别干什么用?
答:图像是分层渲染的。图层可以理解为渲染顺序最大的分类。Ren'Py中默认的图层列表定义如下:
[RenPy] 纯文本查看 复制代码 define config.layers = [ ‘master’, ‘transient’, ‘screens’, ‘overlay’ ]
实际渲染也是按照这个顺序。基本原则是先渲染的图层显示在最下面,后渲染的图层覆盖在前面的图层上。默认情况下定义的所有图像(image)都在“master”图层上。“transient”主要用于UI,“screens”用于界面,“overlay”我不知道用来做啥的……同一个图层内的图像(image)可以在显示的时候使用 onlayer 指定图层,具体的使用(大概)以后自定义界面的时候会展开。
好了,第四篇差不多可以结(fang)束(qi)了……
认怂部分:我了解本次使用的所有图片素材版权归属于 TYPE-MOON和 Aniplex,如果他们发律师函要告我,肯定会删掉所有内容的。幸好写的东西没有商业价值,也不用赔钱。也就是俗话说的 “玩完了不给钱,就不算嫖咯”~
预告部分:下一篇依然是图像,是说 transform 还是 transition还没定。选择困难症,胃疼……
“Ren'Py引擎从入门到放弃”系列教程 |