欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

cocos2dx-lua 骨骼动画spine使用心得(cocos2dx版本 3.17 spine版本3.6.53)

程序员文章站 2024-03-16 16:00:28
...

1.骨骼动画简述

骨骼动画是cocos2d-x动画在人物渲染方面的技术,分二个部分:用于绘制人物的外观呈现(被称为蒙皮或者mesh)和用于mesh进行动画(造型和关键帧) 的一组分层的相互连接的骨骼.

优势:

1 骨骼绑定可以让动画更精准,更真实自然,并可通过程序动态控制
2 动画各部分采用拼接方式,占用位图/内存资源少
3 骨骼显示对象与骨骼的逻辑分离,可在不影响动画播放的情况下动态更换

2.骨骼动画工具

一般美术这边采用的是spine编辑工具,动画制作好后产出一个.json文件,一个.atlas文件和一个.png文件。1

3.应用于代码中

1.创建动画

cocoslua中引擎提供我们的方法是

sp.SkeletonAnimation:create(jsonFilePath,atlasFilePath,scale)

create函数接受三个参数:json文件路径,atlas文件路径,scale

这里scale默认为1,想要调整大小就调整为大于1或小于1的值即可

2.设置要播放的动画

要播放什么动画,我们使用setAnimation方法,这个方法的作用是立即结束当前动画,转而开始另一个动画

sp.SkeletonAnimation:setAnimation(trackIndex,animationName,isLoop)

第一个参数trackIndex我认为是表示我们要播放的动画处于第几个通道,每个通道可以有自己的动画序列(而trackIndex较高的会覆盖较低的动画)。
第二个参数即动画名
第三个动画为是否循环,true为循环,反之则为播放一次停止。

还有一个是addAnimation函数,参数与setAnimation一样,其作用并不是立刻结束动画,而是等该动画结束之后开始下一个动画。

3.动画事件监听

有时候我们并不想要角色重复播放一个动画,这时候就需要在一个动画播放完成后进行接下来的动作,那么动画事件监听就要在这里使用了。

sp.SkeletonAnimation:registerSpineEventHandler(callback(event),listenerEvent)

第一个参数为一个回调函数,我们在回调函数中可以对监听到的事件进行处理
第二个参数为监听事件种类,主要有以下几种:

1.ANIMATION_START -动画开始
2.ANIMATION_END -单个动画结束
3.ANIMATION_COMPLETE -动画流程结束
4.ANIMATION_EVENT -动画事件

而在callback回调函数中想要根据监听事件处理问题,我们还需要从参数event中获取下列信息:
event.animation 动画名
event.loopCount 循环计数
event.trackIndex 动画所处的通道
event.type 动画监听事件中具体监听的类型
通常我们可以使用event.animation分辨出要监听哪一种动画,并且根据event.type可以更详细地区分出那些不需要的情况。

在实际使用中我还发现了这样一个问题(不知道是否其他人也碰到过):
用模拟器与真机监听动画所需的监听事件名并不一样,在模拟器中可以正常监听的ANIMATION_EVENT+event.type == complete在真机上无法使用,原因是监听补刀ANIMATION_EVENT,而真机需要使用的是ANIMATION_COMPLETE。

4.其他动画设置的小操作

1.动画衔接

对于一般情况下,动画的切换要求两个动画完全能衔接上,不然会出现跳跃感,这个对于美术来说要求很高,而Spine加了个动画混合的功能来解决这个问题。使得不要求两个动画能完全的衔接上这个功能在序列帧动画时是无法实现的,也是最体现Spine价值的一个功能。

sp.SkeletonAnimation:setMix(fromAnimation,toAnimation,duration)

第一个参数fromAnimation为要衔接的前一个动画名
第二个参数toAnimation为要衔接的后一个动画名
第三个参数duration为需要多少时间从fromAnimation过渡到toAnimation,过渡时间为动画重叠时间。
动画过渡时间决定着两个动画衔接的是否完美,而在实际使用中,如果想要衔接两个动画,那么需要将他们分别放在fromAnimation和toAnimation中,例如

sp.SkeletonAnimation:setMix(fromAnimation,toAnimation,duration)
sp.SkeletonAnimation:setMix(toAnimation,fromAnimation,duration)

能达到效果

2.设置调试效果

设置骨骼调试是否可见

sp.SkeletonAnimation:setDebugBonesEnabled

设置mesh蒙皮调试是否可见

sp.SkeletonAnimation:setDebugMeshesEnabled

设置区域调试是否可见

sp.SkeletonAnimation:setDebugSlotsEnabled:

3.加载缓存

时间消耗点:io和现场解析

解决方案:加载过的骨骼动画就不要每次重新加载,不要每次都去加载json文件和atlas。

时间消耗点:Json解析。

解决方案:尽量共用骨骼(json是骨骼描和动画描述文件,altas是图集文件)文件,也就是尽量让多个atlas对应同一个json,但是这个度要自己掌握,json文件大小不要超过2mb,把这个json预解析。

原理大概是这样的,但是具体的缓存实现方法还没有在cocoslua中找到spine相关的缓存加载接口,目前修改spine引擎比较困难,希望以后能够实现。


  1. 这里需要注意的是游戏中使用的spine版本和编辑器输出的版本要保持一致,否则会有动作显示不正确、不完整的情况出现 ↩︎