cocos2d-x 3.0正式版本已经放出下载了。
但是这个版本播放Armature动画有一个很奇怪的现象。
使用cocostudio 动作编辑器编辑Aramature动画的时候,把补间动画给取消掉,在动作编辑器和场景编辑器里显示都是没问题的,而到了正式运行的时候,发现补间动画还在。
这在骨骼动画里当然不会有什么明显的体现,但是到了帧动画里面,如果对关键帧的位置进行过调整,程序根据你关键帧的移动额外增加很多补间帧,这些帧会导致动画播放的时候不停的在跳动!
究其原因是cocos2d-x 3.0存在问题,使得无论你是否取消补间动画,都会以补间动画的形式播放。
怀着试试看的心态,将动画放到cocos2d-x 2.2.3中播放,结果发现动画是正常播放的,并没有补间动画的存在。
这也就意味着cocostudio导出的格式是没问题的,而问题应该出在cocos2d-x 3.0的身上。
通过VS里的断点调试,找到了对Armature骨骼动画数据进行处理的CCDatas.cpp文件。
类里面有一个 FrameData::copy 函数
通过分析发现,这个copy函数居然漏掉了isTween的处理,isTween变量默认是正的,而isTween正是判断有没有补间动画的变量。
也就是说程序收到的永远是:你要求他播放补间动画!!
将isTween处理的相关代码加入。
isTween = frameData->isTween;
如下图:
保存后重新编译执行,发现Armature动画已经能正常播放了,补间动画没有出现,问题解决!
附:
修改后的copy函数如下:
void FrameData::copy(const BaseData *baseData)
{
BaseData::copy(baseData);
if (const FrameData *frameData = dynamic_cast<const FrameData*>(baseData))
{
duration = frameData->duration;
displayIndex = frameData->displayIndex;
tweenEasing = frameData->tweenEasing;
easingParamNumber = frameData->easingParamNumber;
CC_SAFE_DELETE(easingParams);
if (easingParamNumber != 0)
{
easingParams = new float[easingParamNumber];
for (int i = 0; i<easingParamNumber; i++)
{
easingParams[i] = frameData->easingParams[i];
}
}
blendFunc = frameData->blendFunc;
/*
cocos2dx 3.0 BUG,进行帧数据copy的时候漏掉了isTween
而isTween默认值为true,导致Armature无论在cocostudio中如何设置,实际播放时都一直存在补间
**/
isTween = frameData->isTween;
}
}