Ren'Py学习笔记(二)转场效果
这是Ren'Py视觉小说引擎学习系列的第二篇文章。这个系列主要记录笔者在学习该引擎时的一些总结和感受。
本文的主题是转场(Transitions)。
什么是转场
转场用来在场景切换时提供特殊的效果。如果不使用任何转场,那么新的背景图和立绘将瞬间覆盖旧的场景,显得十分生硬。为了使场景过渡显得流畅自然,现在的视觉小说大量使用了效果各异的转场。
使用转场
Ren'Py 中,转场效果是通过 with 语句 呈现的。with 关键词后跟的是转场效果的名字。在下面的例子中,dissolve
默认为历时0.5秒的溶解效果(实际上像是淡入淡出)。
show bg washington
with dissolve
show eileen happy at left
show lucy mad at right
with dissolve
转场是可以被用户打断的。用户如果打断,那么转场将立即完成。
连续书写的show
语句将共享同一个转场。在上面的例子中,bg washington
的转场效果是dissolve
,而eileen happy
和lucy mad
共享了最后一行指定的dissolve
转场,所以最后的效果是背景、两个立绘都使用了dissolve
转场。但第二个dissolve
是在第一个dissolve
完成之后才开始的。
如果希望三个图像对象同时开始dissolve
转场,则需要撤掉上面例子中的第一个with dissolve
。
如果希望背景立即出现而立绘使用转场,就必须用到with None
:
show bg washington
with None
show eileen happy at left
show lucy mad at right
with dissolve
with
实际上有两种写法:独立成行的和跟在show
、scene
或 hide
语句之后的。跟在语句之后的 with
称作 with
子句。with
子句的效果相当于在自己跟的语句前面加上一个with None
:
show aaa with dissolve
# 等价于
with None
show aaa
with dissolve
(说实话不是很懂有什么区别,个人感觉只用with
子句就完全够用了)
内置转场效果
Ren'Py 内置了一些转场效果,已经可以完成比较常见的转场。可以参考这篇文档。
Rule图和自定义转场效果
rule 图实际上是一张描述转场效果的黑白图片。这篇文章很好地讲解了galgame中常见的转场与图片effect效果,内有清晰明了的GIF图片,建议学习一下。
下面这张图展示了柚子社最常用的一种顺时针旋转遮盖式转场的rule图。
Ren'Py 提供了许多转场类,供用户自定义转场效果。转场类根据指定的参数返回一个转场效果,供with
使用,或者使用define
定义成一个常用的转场效果。以Dissolve
类为例:
show aaa with Dissolve(10.0) # 一个持续时间10秒的溶解转场
define long_dissolve = Dissolve(10.0) # 定义转场效果
show aaa with long_dissolve # 使用定义好的转场效果
Ren'Py 支持使用 rule 图来自定义转场效果。需要用到的转场类是ImageDissolve
。ImageDissolve
转场将从旧场景按照 rule 图中从白色到黑色的顺序,以溶解(dissolve)的方式,逐渐过渡到新场景。
define clockcycle = ImageDissolve("rule/rule_16.png", 2, 4)
ImageDissolve
的第一个参数是 rule 图的路径,第二个参数是转场持续的时间,第三个参数必须是2的整数次幂,默认值为8,可以简单地理解为该参数控制了转场时的模糊程度,数字越大越模糊。实际上的原理是,假设该参数为n,当前过渡完毕的像素的灰度是x(灰度值越大越白,最大值255),那么当前的像素过渡完毕后,在rule图中属于[x-n, x]
的像素将开始过渡。显然n越大,同一时刻参与过渡的像素越多,体现出来的效果就是模糊程度高。
还可以附加reverse
参数,该参数默认是False
。如果设置为True
,那么转场是反过来的:先处理 rule 图中黑色部分对应的区域,再逐渐扩散到白色。
该函数还有两个参数,属于较高级的用法,此处不详细介绍了。