找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7451|回复: 0

[转载] Ren'Py引擎从入门到放弃(5)——也不是很难的ATL基础

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

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

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

×
本帖最后由 BuErShen 于 2019-4-25 16:16 编辑

Ren'Py引擎从入门到放弃(5)——也不是很难的ATL基础

世上无难事,只要肯放弃。

还是继续讲图像(image)的内容。

这是入门介绍的第五篇,主要内容是ATL基础——特性(property)

ATL的全称是 Animation and Transformation Language,动画和变换语言。

第一个问题:ATL用来做什么的?

答:从名称定义可以看出来,ATL是用来实现 动画(animation) 变换(transform) 两种功能的。

需要注意的是,这里的 动画(animation)其实是动词animate的名词化,本意是指按照某个顺序连续播放的动态图像。同样,变换(transform)则是变形金刚(Transformers)的非人格化形式——这句当然是胡说八道。变换(transform)一般是指静态图像的特性变化。

Ren'Py内置了几个变换,主要是几个常用的位置以及重置效果,这里就不罗列了。

简单来说,涉及时间的都可以算动画。动画可以是不同静态图像的播放序列,也可以是单个静态图像的变换。所以Ren'Py就把这俩放在一块了。在实际使用时,变换是基本要素,动画是高阶实现。

第二个问题:ATL的常用语法有哪些?

答:大体上有两类:单独定义的transform 和 image定义中的transform。

首先说如何单独定义transform:
[RenPy] 纯文本查看 复制代码
"transform" name "(" parameters ")" ":"
    atl_block

双引号中的是固定关键词,name是可以自定义的变换名称,parameters是有可能存在的参数,atl_block表示具体的代码块。举个栗子:
[RenPy] 纯文本查看 复制代码
transform lefttop:
    xalign 0.0
    yalign 0.0

这里创建了一个transform,功能是把“某个东西”的位置设为画面的左上角(对齐)。这里的“某个东西”就是transform的应用对象,可以是任意合理的对象,包括 可视组件(displayable)和角色对象等。由此可见,定义好的 变换(transform)是可以复用的。可以在 show语句后面的 at分句中应用:
[RenPy] 纯文本查看 复制代码
# 假设某个image的名称叫test_image
show test_image at lefttop

# 假设定义的某个角色名叫eileen
show eileen at lefttop

transform定义中的xaligh和yaligh都是特性(property),详细的列表请参见文档:
Animation and Transformation Language — Ren'Py Documentation
动画和变换语言 — Ren'Py 中文文档

这类对几个常用的特性做个简短说明:

posxposypos是整个界面的绝对坐标,坐标原点是界面左上角。值可以大于整个界面分辨率,也可以是负数。这些特性的值如果是整数,单位就是像素;值如果是分数,表示一个比例。像素值很好理解,参考下图:
pos、xpos和ypos是整个界面的绝对坐标.jpg
分数表示比例的情况略复杂(但用起来更方便)。假设整个界面的大小是(1280, 720),宽度为1280像素,高度为720像素。如果把xpos设置为0.5,对应的像素值就是640;类似的,把ypos设置为0.8,对应的像素值就是576。

  • anchorxanchoryanchor是image或者sprite的锚点相对坐标,坐标原点是image或者sprite自身的左上角。值可以大于图像自身尺寸,也可以是负数。因为通常图像不是一个像素点,而是一个矩形。当我们想要某个图像放置到界面的指定坐标时,其实是将锚点放到指定的位置上。锚点可以是图像左上角、右上角或正中心。锚点与pos系特性一样,如果是整数,单位就是像素;值如果是分数,表示一个比例。
  • 用以上几个特性使用分数有个优势,可以不用关注具体的像素值。常用的几个坐标位置不外乎上下左右4边和中线,顶多加上三分之一作为近似黄金分割点,也就是0.0、1.0、0.5和0.33几个值。注意:0≠0.0 1≠1.0。1和1.0的区别很明显,如果写错了很容易就会发现图像位置不对。0和0.0在很多情况下实现的效果是一样的,并不会出现显示错误。但在数值是变量的情况下,并且进行过数学运算后,就容易出现预料之外的错误。举例来说:
[RenPy] 纯文本查看 复制代码
# 设置起始xpos和目标xpos
init python:
    ori_xpos = 0.0
    des_xpos = ori_xpos + 100

# 定义一个从左往右移动的transform
transform moveright:
    xpos ori_xpos
    linear 2.0 xpos des_xpos
    repeat

这段代码的本意是要将目标图像向右移动100个像素,但起始坐标写成了0.0,导致目标坐标的运算结果是100.0,也就是向右移动的距离是“整个界面宽度×100”。这是Python的内部机制,不同的数据类型进行计算时,变量类型自动转换为参与运算的所有变量中精度最高的那种。常见的几个数据类型精度从低到高分别是:布尔型、整型、长整型、浮点型和复数。如果不能理解前面那句话,请记住一点即可:0≠0.0

  • alignxalignyalign等属于复合特性,是由前面几个特性组合而成,也就是用来偷懒的。align系会把对应的 pos系与 anchor系设置为同一个值。也就是说下面两种定义是完全等价的:
[RenPy] 纯文本查看 复制代码
# 设置为靠右对齐
transform rightside1:
    xanchor 1.0
    xpos 1.0

# 设置为靠右对齐
transform rightside2:
    xalign 1.0
  • 复合特性还可以组合出其他复合特性,比如 center系列。
  • zoom系可以缩放图像,类似于其他软件或引擎中的scale。可以设置为负数,用来生成镜像。
  • alpha控制透明度。0.0为完全透明,1.0为完全不透明。alpha配合时间设置很常用的一个特性。需要注意的是,alpha的有效区间是[0.0, 1.0],并且无法修改原图的alpha通道值。在png格式的图片中是带alpha通道的,与R、G、B通道相同也是8位,取值区间为[0, 255](0完全透明,255完全不透明)。如果png图片中的 alpha通道值是127,也就是50%的透明度。若使用 transform调整图像透明度时,不透明度的上限就是50%,不可能调成100%完全不透明的状态。
  • additive特性是个很有趣的设置。默认值是0.0,使用over形式。可以设置为1.0,使用 add形式。这两种形式的具体算法我也没弄明白。从结果上来看,使用add式会更亮一些。
  • angleradius加上 aroundalignaround组合起来实现圆周运动,再加上clockwisecounterclockwise控制方向。但是!如果窗口不是正方形的话,这种方式实现的是椭圆运动。原因是,radius这个半径值,是一个position值,表示的是界面宽度和高度的一个比例值。
  • rotateanchor可以实现图像的旋转,以及真正的圆周运动。anchor是旋转的圆心,旋转半径不能直接设置,只有使用图片的尺寸“估算”。
  • delay是一段暂停时间,可以控制各段动画的时间间隔。
  • event控制组件是否接收消息事件,与 on语句有关。主要是防止有父子关系的组件被同一个事件影响。
  • pan系和 tile系与特殊的图片有关。pan系用于全景图,tile系用于tile图。

第三个问题:有没有样例?

答:这些 特性(property)的基本使用都比较简单,自己随便找张图试试就能掌握。稍微花哨点的效果需要用到ATL中的一些语句,那是下一篇的主要内容。

好了,第五篇差不多可以结(fang)束(qi)了……

预告部分:下一篇继续ATL的语法……语句比较多,要不要分两篇呢……



“Ren'Py引擎从入门到放弃”系列教程

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-4-27 08:14 , Processed in 0.067671 second(s), 16 queries , File On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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