马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 BuErShen 于 2019-4-25 17:07 编辑
Ren'Py引擎从入门到放弃(6)——略微有点难的ATL语句
世上无难事,只要肯放弃。
还是继续讲图像(image)的内容。
这是入门介绍的第六篇,主要内容是ATL基础——ATL语句。
ATL的全称是Animation and Transformation Language,动画和变换语言。
第一个问题:ATL语句是什么?
答:简单来说,就是控制代码,根据我们的需要实现动画或变换效果。比如,想要将某个image放大为原尺寸的2倍,可以在脚本中show语句后面加一句ATL:
[RenPy] 纯文本查看 复制代码 zoom 2.0
简单粗暴地实现……zoom是上一篇里说的变换特性(property)。这就是要先讲特性再说语句的原因。了解各个特性的作用是基础,在语句中运用特性是目标。
第二个问题:有哪些常用的语句和用法?
答:官方文档里有说明,而且每个语句都给出了例子,很容易理解。这里就不复制粘贴了,仅作一些扩展说明。
interpolation语句可以看作是Ren'Py所有ATL的原点。interpolation是离散插值的意思,interpolation语句在Ren'Py中的处理过程也是分隔成各个离散值再进行处理。所有的特性(property)都可以在interpolation语句中使用。简单来说,想要定义好的image做点改动而又不需要麻烦美术人员增加图片的时候,就用interpolation语句吧。
repeat语句很常用,动画的循环播放就靠它了。Ren'Py中的sprite默认是不使用序列帧动画的。把多个动画帧按顺序放入一个image或者transform中,并使用time语句定义每个动画帧持续时间,可以实现一个自定义的序列帧动画。最后加上一个repeat语句就能循环播放。举个栗子:我们有这样一个图片(当然图片不是我做的):
8个动画帧实现一个图标旋转的效果。图片切割工作可以事先用图像编辑软件处理,也可以用Ren'Py的 crop特性或者 Crop函数处理……为了省事,我就把切割后的8个图片分别命名为 frame_1、frame_2、frame_3、frame_4、frame_5、frame_6、frame_7、frame_8。
[RenPy] 纯文本查看 复制代码 # 原图rotatelogo,大小256*64
image frame_1:
"rotatelogo.png"
crop_relative True
crop (0, 0, 0.125, 1.0)
image frame_2:
"rotatelogo.png"
crop_relative True
crop (0.125, 0, 0.125, 1.0)
image frame_3:
"rotatelogo.png"
crop_relative True
crop (0.25, 0, 0.125, 1.0)
image frame_4:
"rotatelogo.png"
crop_relative True
crop (0.375, 0, 0.125, 1.0)
image frame_5:
"rotatelogo.png"
crop_relative True
crop (0.5, 0, 0.125, 1.0)
image frame_6:
"rotatelogo.png"
crop_relative True
crop (0.625, 0, 0.125, 1.0)
image frame_7:
"rotatelogo.png"
crop_relative True
crop (0.75, 0, 0.125, 1.0)
image frame_8:
"rotatelogo.png"
crop_relative True
crop (0.875, 0, 0.125, 1.0)
# 每0.1秒切换一个动画帧
image logo:
"frame_1"
0.1
"frame_2"
0.1
"frame_3"
0.1
"frame_4"
0.1
"frame_5"
0.1
"frame_6"
0.1
"frame_7"
0.1
"frame_8"
0.1
repeat
效果如下(gif放大了两倍):
Ren'Py没有图形编辑器,制作动画必须熟悉ATL……
choice语句实现了一些随机性。可以用来实现一些类似抽奖的功能。随机性在游戏设计中是个很可怕的东西,作用原理的研究可以追溯到斯金纳盒子。注意每个choice语句后面可以添加权重值,所有并行的choice的权重值都会做归一化处理。归一化的意思是,所有权重值的和作为分母,各选项的权重值作为分子,得到的结果就是对应选项出现的几率。
[RenPy] 纯文本查看 复制代码 show randomlogo:
choice 10:
"frame_1"
choice 2:
"frame_2"
choice 3:
"frame_3"
上面的脚本中,frame_1的几率归一化之后是 10/15 ,也就是约0.67;frame_2的几率是 2/15;frame_3的几率是 3/15 。
block语句是其他几种复杂语句的原型。主要是隔离内部语句的作用域,比如repeat语句。还有 parallel语句和 contain语句也类似,都是为了限制repeat等语句。(repeat:感觉自己被针对了!)
第三个问题:warper是什么?
答:比较准确的说法,warper是一种将时间从线性映射为非线性的函数。以linear为例(实现的效果是线性的,还是做了一次时间的映射),如果我们需要把一个图像在5秒中内放大2倍,可以这样写:
[RenPy] 纯文本查看 复制代码 show logo:
truecenter
linear 5.0 zoom 2
图片是均匀放大。更准确的说,每一帧 1/30 秒都放大 2/(5.0×30) 倍。如果使用缓动函数映射成非线性,则每一帧放大的值就不是 2/(5.0×30) 倍了。具体映射成多少可以根据对应的缓动函数进行计算(不过也没必要那么蛋疼计算,看看效果就行)。需要注意Ren'Py的缓动函数名称可能与JavaScript中的名称不一样(甚至相反)。
好了,第六篇差不多可以结(fang)束(qi)了……
预告部分:下一篇可能会讲图像操纵器(Image Manipulator),也可能会开个支线……
“Ren'Py引擎从入门到放弃”系列教程
|