突然间,微博上被@了,一看原来是之前的关于介绍 spine 的文章引起的。然后就是一阵惭愧,又开了一坑,然后就木有了。虽然,一直在研究 spine,但是的确没写下来相关的内容。于是,赶紧,补了一些内容。

  官网内容转发,没啥技术含量。我自己写的运行库也完成了,虽然还需要打磨,但是比官方的更符合2dx 的风格。做了许久之后,对 spine 的理解更深了一点,然后就胡乱介绍下设计思路和为什么这么做。

概念


先来介绍下 spine 中的一些术语和概念

  • Bone 骨骼

spine 是骨骼编辑器,所以骨骼是基础。每个骨骼都会有旋转,缩放,位移的属性。然后骨骼可以有子节点,最终形成了一个树型结构。可以对应2dx 里面的 node

  • Slot 插槽

骨骼上的一个挂载点。不是所有的骨骼上都能放置东西的,因为很多骨骼其实只参与计算,真正重要的骨骼,也就是需要挂载其他东西的骨骼上必须放置插槽。slot 只是用来标记特殊的骨骼位置,本身只有一个颜色属性,也可以说,重要的骨骼节点可以称为 slot。

  • Attachment 附件

挂在插槽上的内容,可以是图片,也可以是判定区域,只要是你能想到的东西,都可以当成附件。

  • Draw order 描画顺序

骨架上插槽的一个顺序列表。用来控制描画的先后顺序。

  • Animation 动画

基于时间轴的一个骨骼状态列表。

  • Skin 皮肤

一套附件的集合,类似于换装。

  • Bounding Box 边界框

用来指定骨骼上的边界的多边形的区域。

  • atlas 图集

贴图集合,小图片合并在一起,就成了图集。

实现


上面大致介绍了一些基本概念,然后我们从实现角度上来说下为啥这么设计。

首先,假设我们需要一个骨骼系统。很酷,是的,最近的确比较火。于是,我们就设计了一个树状的骨架,每个节点就是(Bone)。

很简单啊,再想下,骨骼上要放图片啥的,于是我们就要能访问到特定的骨骼,遍历太傻了,好吧,我们给这些骨骼加个名字,这样就能访问到具体 骨骼了,那这些名字就叫 slot。

好吧,可能有些人觉得,slot 和 bone 本质上一样,为啥需要分开呢,没必要的。我只能说事情其实并不简单,来想下,我们已经有了一个完美的骨架,图片也在应该在的骨骼上了。那我们该如何显示图片么?遍历么,从根结点开始,一直到最下层的节点,不管你用啥排序,这个顺序是固定的,但是现实总是很残酷,很多时候,我们需要不停调整图片描画的顺序,也就是调整树的节点排序,啊,好麻烦。那怎么办,我们指定下骨骼描画的顺序吧(Draw order),这些特定的骨骼也就是 slot。

你看,这下完美了,也就是 bone 用来计算位置,slot 用来控制描画。

完美的骨骼系统,一定要有碰撞区域(bounding box),这和图片差不多,一个用于显示,一个用于边界判断,好吧,那就抽象成一个概念叫(p_w_upload),于是,slot 上就可以附加不同的 p_w_upload 了。

终于可以换附件了,但是一个一个换好累。于是,我们把一组附件合在一起,组成了 skin。这下简单了,一换 skin,整个世界就变样了。

啊,做着做着,就发现图片太多了,要优化啊。怎么办,简单,把小图片合在一起,每个图片对应了一个大图里面的一个区域,这就是 atlas。

啊,不早了,先说到这里吧,下次有空继续。