Ren'Py学习笔记(二)转场效果

发布时间 2023-04-04 21:12:33作者: Eslzzyl

这是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 happylucy 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 实际上有两种写法:独立成行的和跟在showscenehide 语句之后的。跟在语句之后的 with 称作 with 子句。with 子句的效果相当于在自己跟的语句前面加上一个with None

show aaa with dissolve
# 等价于
with None
show aaa
with dissolve

(说实话不是很懂有什么区别,个人感觉只用with子句就完全够用了)

内置转场效果

Ren'Py 内置了一些转场效果,已经可以完成比较常见的转场。可以参考这篇文档

Rule图和自定义转场效果

rule 图实际上是一张描述转场效果的黑白图片。这篇文章很好地讲解了galgame中常见的转场与图片effect效果,内有清晰明了的GIF图片,建议学习一下。

下面这张图展示了柚子社最常用的一种顺时针旋转遮盖式转场的rule图。

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 图来自定义转场效果。需要用到的转场类是ImageDissolveImageDissolve转场将从旧场景按照 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 图中黑色部分对应的区域,再逐渐扩散到白色。

该函数还有两个参数,属于较高级的用法,此处不详细介绍了。