RenPy中文空间

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 476|回复: 0

[转载] Ren'Py引擎从入门到放弃(8)——层叠式图像

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

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

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

x
Ren'Py引擎从入门到放弃(8)——层叠式图像

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

这是入门介绍的第八篇,主要内容是 Layered Image —— 层叠式图像

首先,我已经放弃抠图……抠图是不人道的!太蛋疼了!我特么……(省略800字)

所以,就在lemmasoft论坛借用了一点资源:ID为 leon 的某个同学发布的一个换装demo。原帖地址如下:
[tutorial] Dress up game - Lemma Soft Forums

这个帖子发布时间为2012年3月27日(sometimes, old way is good way),当时还没有层叠式图像的功能。所以我借用了原帖的图片资源,讲解层叠式图像。原帖开头就有图片资源下载链接,有需要的请移步自行下载。

第一个问题:层叠式图像是什么?

答:层叠式图像(Layered Images),是采用 图层(layer)设计思想的一种可视组件。重点是 —— 一种可视组件(displayable)。能使用其他可视组件的地方,也就可以用层叠式图像。

Ren'Py在7.0版新增的这个功能,主要是解决人物立绘可以灵活变化(但是脚本不能又臭又长)的需求。

一般来说,如果某个角色的多个立绘在主体基本相同,表情、服装、饰品等略有差异,有两个设计思路:

  • 让画师生成所有搭配组合的静态图。举例来说,某个角色有4套服装、4种发型和6种表情,就总共有96种组合方式,也就是96张静态图片。这仅仅是一个角色……存储空间表示压力很大。但是,还真有不少游戏就是这样做的,比如废狗……(所以说DELiGHTWORKS到底会不会做游戏并不重要)
  • 画师生成主干图和各种可更替的部件图,在程序中搭配组合,也就是“纸娃娃”系统。请注意,“纸娃娃”只是一个设计思路,不同厂商、不同引擎可能使用的是不同的方案实现类似效果。在Ren'Py推出层叠式图像之前,要实现类似效果,需要在脚本中写出所有搭配的组合方式。举例来说,某个角色有4套服装、4种发型和6种表情,就总共有96种组合方式,也就是定义96个image对象。emmmmmmm……

有了层叠式图像后,画师不用出那么多图,开发者不用写那么长脚本,可以说是非常便于开(tou)发(lan)的功能。

第二个问题:层叠式图像有哪些语法?

答:官方文档给出了语法的样例,这里抽取几个重点。

  • always语句中图像通常是主干图,因为一直会显示。主干图可以是一张图片或者多张图片组合而成。但是!always语句中只可以放1个可视组件!所以,如果要多张图片组合拼接,可以使用Composite之类的函数先合成一个Image对象。
  • group语句后面可以自定义对应图像的 特性(property),比如位置、缩放、锚点等。但是不能使用 变换(transform),就是说只能使用固定值。如果某个部件图需要有变换或动画效果,也需要在前面使用 ATL语言定义Image对象。
  • 层叠式图像的绘制顺序与 group语句顺序相同,后定义的组覆盖在前面的组上。一般是先画主干图,接着表情和主要衣物,最后是饰品和其他东西。
  • group语句里的 attribute跟我们定义 Image对象时的图像属性(attribute)类似。注意使用的时候同组的属性名不可以同时出现,因为各属性是冲突的,运行会报错。
  • if - else语句后面的变量或者表达式使用的变量,需要在层叠式图像的定义前面定义。
  • auto语句……注意图片文件的命名规则是使用下划线分隔,与其他 Image对象使用各个分隔符不同。另外,auto语句没有提高多少效率,根据文件名自动识别attribute并不怎么方便,优点是做完 default图之后,后续添加新图片不用改层叠式图像定义部分的代码。
  • layeredimage定义的图像也可以加图像标签(tag),官方称之为姿势(pose)。
  • LayeredImagePorxy可以用作对话框头像。

第三个问题:实际效果是什么样的

答:以开篇提到的图片资源,定义一个层叠式图像:
[RenPy] 纯文本查看 复制代码
# 图片文件名未修改过,不使用自动化属性
layeredimage someone:
    always:
        "base"

    group glasses:
        attribute glasses1 default:
            "glasses1"
        attribute glasses2:
            "glasses2"
        attribute glasses3:
            "glasses3"
        attribute glasses4:
            "glasses4"

    group hair:
        attribute hair1 default:
            "hair1"
        attribute hair2:
            "hair2"
        attribute hair3:
            "hair3"
        attribute hair4:
            "hair4"
        attribute hair5:
            "hair5"
        attribute hair6:
            "hair6"
        attribute hair7:
            "hair7"

    group shirt:
        attribute shirt1 default:
            "shirt1"
        attribute shirt2:
            "shirt2"
        attribute shirt3:
            "shirt3"

    group pants:
        attribute pants1 default:
            "pants1"
        attribute pants2:
            "pants2"
        attribute pants3:
            "pants3"

    group tie:
        attribute tie1:
            "tie1"
        attribute tie2:
            "tie2"
        attribute tie3:
            "tie3"

事实上,glasses1图片是多余的。图片是张完全透明的空图像(姑且还是用上)。可以使用下面脚本看看效果:
[RenPy] 纯文本查看 复制代码
show someone
pause

show someone glasses2 hair2 pants2 shirt2 tie2
pause

如果要使用对话框头像并头部更新的话,可以剪裁一块:
[RenPy] 纯文本查看 复制代码
image side someone = LayeredImageProxy("someone", Transform(crop=(91, 24, 251, 184)))

层叠式图像的要点就这些……

预告部分:下一篇是转场(transition)。



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


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

本版积分规则

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

GMT+8, 2019-8-26 01:52 , Processed in 0.109371 second(s), 24 queries , File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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