cocos2dx 3.x版本,.csb骨骼文件换装跟运动控制的方法

隔了段时间,重拾cocos2dx,发现版本变化太大了…cocos studio 到已经从1.x时代升级到2.x时代了.
昨天想把以前的代码在新版本下重来一次,发现在cocos studio上无法导出.ExprotJson格式的骨骼文件,抱怨下cocos的向下兼容能力…

折腾了好久,弄明白了新的.csb的加载方式,骨骼动画也跑起来了,但问题来了,换肤功能怎么办?论坛上也发了个帖,没回复,只能自己研究了.

搜索了下资料,都是以前.ExportJson的换肤方式,无奈只能看看Cocos stuudio每个版本到底更新了什么,也终于在

http://www.cocoachina.com/cocos/20150909/13380.html

发现了头绪;

在技术方面,为使用户能够更为简便地进行骨骼动画编辑,cocos v2.3.2实现了换肤功能,用户通过简单的界面操作,即可完成骨骼动画的图片替换。同时,cocos团队将反向动力学应用到了骨骼动画的制作中,只要确定子骨骼的位置,就能够反求推导出其所在骨骼链上n级父骨骼的位置,进而确定整条骨骼链。此外,cocos v2.3.2版本还设置了骨骼动画碰撞的区域,贴心十足。

简单的理解,骨骼动画的每个节点都可以对应到程序代码的Node节点,分层次的…这样来看,就可以通过控制childNode来改变. 思路有了,代码操作.

动画素材选择:DemoPlayer.csb 就是大家熟悉的牛仔图.

代码片段(骨骼动画的最简单代码,官方教程):

auto rootNode = CSLoader::createNode(“DemoPlayer.csb”);//传入Studio2.x的资源路径
this->addChild(rootNode);//假设this是即将显示的scene

auto action = CSLoader::createTimeline("DemoPlayer.csb");   //加载动画:
rootNode->runAction(action);//注!!!:同一个文件创建的节点只能使用同一个文件创建的动画。
action->gotoFrameAndPlay(0,true);//播放动画:

运动播放控制:
搜索.csb格式骨骼文件使用的过程中,发现也有不少人问题怎么按以前的动作名称控制播放哪种动画;
这里提供2种方式;
一种,按帧控制;比如
action->gotoFrameAndPlay(0,50,true); //播放0到50帧的动画
一种,按Name控制,这种方式需要在Cocos Studio设置骨骼动画的分段名称,比如设置0到50帧为“run”;

action->play(“run”, true); //播放“run”动画

换肤:
直接上代码:
auto rootNode = CSLoader::createNode(“DemoPlayer.csb”);//传入Studio2.x的资源路径
this->addChild(rootNode);//假设this是即将显示的scene

auto button =rootNode->getChildByName(“Layer15”)->getChildByName(“Layer19”); //获取要换肤的骨骼节点
button->removeChildByName(“testAnimation1”); //去掉该骨骼阶段下的子节点
auto sprite1 = Sprite::create(“effect_1.png”);
button->addChild(sprite1); //添加骨骼节点下的新字节点

auto action = CSLoader::createTimeline(“DemoPlayer.csb”); //加载动画:
rootNode->runAction(action);//注!!!:同一个文件创建的节点只能使用同一个文件创建的动画。
action->gotoFrameAndPlay(0,true);//播放动画:

执行看看,是不是换掉了,为了测试,我换掉的是手臂…牛仔变杨过的感觉;其实如果真的要变杨过,直接removeChildByName,不添加新的child即可;

当然更形象点,我们也可以直接添加skin节点,效果是一样的;

auto skin = cocostudio::Skin::create(“effect_1.png”);
button->addChild(skin);

换肤终于完成了,自己瞎琢磨出来的,哪位大大有更好的方法,请提供下,谢谢了.

多谢楼主啊,解决大问题了

一种,按Name控制,这种方式需要在Cocos Studio设置骨骼动画的分段名称,比如设置0到50帧为“run”;
action->play(“run”, true); //播放“run”动画

这个在studio里的那里设置啊,找了好久没找到啊

结构树上边

关于换肤, testcpp 有比较好的方案吧: ActionTimelineTestScene.h TestActionTimelineSkeleton

请问动作之间切换如何处理可以使之更流畅 ?

编辑器里可以换肤,要 勾选开始记录动画,然后你改变图片资源,然后展开结点会出现 图片资源变化 如图
点图片叫我填地址,难道是我浏览器的问题?

敢问lz在使用新版本的骨骼动画,是否又遇到性能问题呢?