找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6378|回复: 0

[转载] Ren'Py引擎从入门到放弃(6)——略微有点难的ATL语句

[复制链接]
发表于 2019-4-25 18:53:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 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语句就能循环播放。举个栗子:我们有这样一个图片(当然图片不是我做的):
序列帧动画.jpg

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放大了两倍):
效果如下(gif放大了两倍).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引擎从入门到放弃”系列教程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|RenPy中文空间 ( 苏ICP备17067825号|苏公网安备 32092302000068号 )

GMT+8, 2024-7-27 23:13 , Processed in 0.130472 second(s), 31 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表