cocos2dx csb动画换装的问题

来源:互联网 发布:mysql timestamp 编辑:程序博客网 时间:2024/05/15 15:41

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); 


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