Cocos2d-x中替换动画(Armature)中的节点与粒子
发布时间:2020-12-14 17:22:33 所属栏目:百科 来源:网络整理
导读:Cocos2d-x游戏开发中常用到骨骼动画Armature,Armature真是个好东西啊,不仅占用资源不大(相对于帧动画来说),而且还能添加帧事件,它还自带有动画的播放、停止、循环事件...balabala废话少说,直入主题。拿到一个骨骼动画的时候,我们往往会有这样的需求
Cocos2d-x游戏开发中常用到骨骼动画Armature,Armature真是个好东西啊,不仅占用资源不大(相对于帧动画来说),而且还能添加帧事件,它还自带有动画的播放、停止、循环事件...balabala 废话少说,直入主题。拿到一个骨骼动画的时候,我们往往会有这样的需求:在情况A下,动画的骨骼a需要显示为样式1,当发生情况B时,这个动画的骨骼a需要显示为样式2。有一种方法,就是将骨骼a单独作为一个动画,这样在使用时可以随意替换,这里不讨论这种方法。情景: 进行角色动画处理时,当玩家装备不同的武器时,我们需要在动画上显示出玩家装备的这个武器(假设所有的武器都只是外观不同)。所以我们需要将动画中表示武器的这个骨骼进行外观的替换。同理,如果武器有发光、移动时拖尾等(用粒子系统实现的)效果,我们同样需要替换这个粒子资源。 替换骨骼(Bone)的显示内容(Display)的方法因为在实际拿到动画的时候可能有多种情况,这里我们分情况解释。举例中所使用的动画资源是使用Cocos Studio 1.6版本资源 动画中已经包含了多个Display虽然我在项目中是直接使用.csb来创建Armature,但是美食大大还是会很慷慨的共享整个动画工程给我。所以,可以打开.ExportJson文件来看一个Name为btn_icon的Bone所包含的Display数据:
Bont-btn_icon.jpeg
动画中没有包含需要的Display这里就不另外放图了,假设上面Name为btn_icon的Bone中只包含了3个Display,而我们需要显示另外一个样式,怎么办呢?我们可以手动添加一个Display。代码如下: 在上面两种方式中,都有出现Index参数,这个参数有点讲究。例如当新增一个Display时,Index参数值如果为0、1、2,就会导致新的Display覆盖原来的Display,如果为3,则正好新增一个Display,如果超过3,则会在addDisplay这一行报错,原因是被断言:Assert failed: the _index value is out of range。 还有上面中的第二个参数,测试后再详细来写。替换骨骼(Bone)的粒子效果(Particle)的方法看过上面方法,替换Bone上的Display就很容易了。如果某个Bone的显示内容就是粒子,使用上面的两种方法也是可以达到解决问题的效果。这里再列出另外一种替换Bone上的粒子效果的方法。Display是一个粒子遇到这种情况,再放一张图好了:
Bone-particle.jpeg
总结:
查看原文:http://www.51xyyx.com/3179.htmlvirtual Bone *getBone(const std::string& name) const; //获得节点void changeDisplayWithIndex(int index,bool force); //根据索引改变显示内容void changeDisplayWithName(const std::string& name,bool force); //根据名称改变显示内容void addDisplay(DisplayData *displayData,int index); //添加一个显示内容void addDisplay(cocos2d::Node *display,int index); //添加一个显示内容void removeDisplay(int index); //移除一个显示内容cocos2d::Node *getDisplayRenderNode(); // 获得Display实际显示的NodeDisplayType getDisplayRenderNodeType(); //查询显示内容的类型virtual DisplayManager *getDisplayManager() const { return _displayManager; } //获取Display的管理器auto pArm = cocostudio::Armature::create("myArmatureName"); //生成Armature对象 auto pBone = pArm->getBone("btn_icon"); //获取Bone对象指针 pBone->changeDisplayWithIndex(1,true); //修改Bone的Display为索引1的Displayauto pArm = cocostudio::Armature::create("myArmatureName"); //生成Armature对象 auto pBone = pArm->getBone("btn_icon"); //获取Bone对象指针 auto pSprite = Sprite::create("icon4.png"); //生成需要显示的Node pBone->addDisplay(pSprite,3); //将新生成的Node添加到Bone中 pBone->changeDisplayWithIndex(3,true); //修改Bone的Display为索引3的DisplaychangeDisplayWithIndexforce/** * DisplayType distinguish which type your display is. */ enum DisplayType { CS_DISPLAY_SPRITE,//! display is a single Sprite CS_DISPLAY_ARMATURE,//! display is a Armature CS_DISPLAY_PARTICLE,//! display is a CCParticle. CS_DISPLAY_MAX };auto pBone = pArm->getBone("pr1"); //获得Bone auto pDisplayNode = (ParticleSystem*)(pBone->getDisplayRenderNode()); //获得Bone的Display的Node,并强转为ParticleSystem(因为已知了它是粒子系统) pDisplayNode->initWithFile("my_particle.plist"); //使用新的粒子文件重新初始化粒子系统getDisplayRenderNode (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |