Cocos2d-x中替换动画(Armature)中的节点与粒子
Cocos2d-x游戏开发中常用到骨骼动画Armature,Armature真是个好东西啊,不仅占用资源不大(相对于帧动画来说),而且还能添加帧事件,它还自带有动画的播放、停止、循环事件...balabala 废话少说,直入主题。拿到一个骨骼动画的时候,我们往往会有这样的需求:在情况A下,动画的骨骼a需要显示为样式1,当发生情况B时,这个动画的骨骼a需要显示为样式2。有一种方法,就是将骨骼a单独作为一个动画,这样在使用时可以随意替换,这里不讨论这种方法。
情景: 进行角色动画处理时,当玩家装备不同的武器时,我们需要在动画上显示出玩家装备的这个武器(假设所有的武器都只是外观不同)。所以我们需要将动画中表示武器的这个骨骼进行外观的替换。同理,如果武器有发光、移动时拖尾等(用粒子系统实现的)效果,我们同样需要替换这个粒子资源。
需要用到的API
首先来说,替换Armature中的节点常用到以下几个函数:
virtual 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实际显示的Node
DisplayType getDisplayRenderNodeType(); //查询显示内容的类型
virtual DisplayManager *getDisplayManager() const { return _displayManager; } //获取Display的管理器
替换骨骼(Bone)的显示内容(Display)的方法
因为在实际拿到动画的时候可能有多种情况,这里我们分情况解释。
举例中所使用的动画资源是使用Cocos Studio 1.6版本资源
动画中已经包含了多个Display
虽然我在项目中是直接使用.csb来创建Armature,但是美食大大还是会很慷慨的共享整个动画工程给我。所以,可以打开.ExportJson文件来看一个Name为btn_icon的Bone所包含的Display数据:
![](http://www.51xyyx.com/wp-content/uploads/2017/06/1496988662-8068-2262310-210da2da94447e90-265x600.jpg)
上面看到"bone_data":后面就是动画中包含的骨骼了,然后可以看到"bone_data"下面第一行就是一个Bone的Name属性。跳过中间一堆位置、循环等属性,往下可以看到一个"display_data"的标签,它所代表的就是当前这个Bone中包含的所有Display。这里可以看到美术大大放置了3个Display,分别名为icon1.png、icon2.png、icon3.png。因为"display_data"所指的值是一个json数组,所以自然我们也知道对应三个Display的Index分别为0、1、2. 在使用这个动画文件生成Armature对象时,Name属性为btn_icon的这个Bone默认显示的是索引为0的Display。 此时,如果我们需要改变这个Bone的显示内容,只需要如下语句即可:
auto pArm = cocostudio::Armature::create("myArmatureName"); //生成Armature对象
auto pBone = pArm->getBone("btn_icon"); //获取Bone对象指针
pBone->changeDisplayWithIndex(1, true); //修改Bone的Display为索引1的Display
这是在动画中已经包含了多个Display的情况下,进行Bone的Display的切换。如果美术大大没有在Bone中添加好所有需要的Display怎么办呢?我们可以自己添加。
动画中没有包含需要的Display
这里就不另外放图了,假设上面Name为btn_icon的Bone中只包含了3个Display,而我们需要显示另外一个样式,怎么办呢?我们可以手动添加一个Display。代码如下:
auto 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的Display
在上面两种方式中,都有出现Index参数,这个参数有点讲究。例如当新增一个Display时,Index参数值如果为0、1、2,就会导致新的Display覆盖原来的Display,如果为3,则正好新增一个Display,如果超过3,则会在addDisplay这一行报错,原因是被断言:Assert failed: the _index value is out of range。 还有上面changeDisplayWithIndex
中的第二个参数force
,测试后再详细来写。
替换骨骼(Bone)的粒子效果(Particle)的方法
看过上面方法,替换Bone上的Display就很容易了。如果某个Bone的显示内容就是粒子,使用上面的两种方法也是可以达到解决问题的效果。这里再列出另外一种替换Bone上的粒子效果的方法。
Display是一个粒子
遇到这种情况,再放一张图好了:
![](http://www.51xyyx.com/wp-content/uploads/2017/06/1496988662-3009-2262310-fd0f44cd0c0c49af.jpg)
同样是在上面提到的.ExportJson动画文件中,这里可以看到Bone的Name属性为pr1,它的"display_data"所表示的不是图片名,而是一个plist文件,这里就是粒子系统(ParticleSystem)文件。 将这张图中"display_data"的内容与上一张图(Bont-btn_icon)中的进行对比,可以看到"displayType"的值不同。 我们看看源码中的这个属性:
/**
* 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
};
可以了解到,Display是包含三种属性的,一是精灵(Sprite),资源就是png图片;二是动画(Armature);三是粒子(Particle),也就是我们现在遇到的。它们的枚举值分别为0、1、2,所以上图中的"displayType"值为2,表示资源是粒子文件。 然后粒子文件要如何来替换呢?其实可以直接获得这个Display显示的Node,然后来修改Node的内容。看下面代码:
auto pBone = pArm->getBone("pr1"); //获得Bone
auto pDisplayNode = (ParticleSystem*)(pBone->getDisplayRenderNode()); //获得Bone的Display的Node,并强转为ParticleSystem(因为已知了它是粒子系统)
pDisplayNode->initWithFile("my_particle.plist"); //使用新的粒子文件重新初始化粒子系统
这样在播放动画时,我们看到的就是新的粒子系统的效果了。 其实这种方式,对于上面所说的Sprite类的Display也适用。
总结:
- 没有什么好总结的啊。。。
- 好吧,强行要总结,我也没什么好总结的
- 其实还有一些情况是我没有写到的,就是如果Display是一个Armature,不过方法应该都差不多
还有几个问题:
- 如果在Armature刚刚生成好,还没有播放任何动画时,去切换Display,如果force参数填true,则这个Bone会强行显示出来,如果填false,则根本切换不过来。不知道这里会不会有我操作失误,待测。
- 在更换粒子效果时,如果粒子效果在当前帧还没有显示,此时使用
getDisplayRenderNode
获取到的值为nullptr。
查看原文:http://www.51xyyx.com/3179.html
Cocos2d-x中替换动画(Armature)中的节点与粒子相关推荐
- Excel中替换单元格中的换行符
替换前内容: 按ctrl+H进入替换界面,点击查找内容输入框,让光标在输入框中,按ctrl+J,在替换内容中输入要替换为的内容: 点击全部替换即替换成功 注意:ctrl+J输入的内容只能通过delet ...
- Android中的动画
视频课:https://edu.csdn.net/course/play/7621 学习内容 Ø 帧动画 Ø 补间动画 Ø 动画方式切换组件 能力目标 Ø 掌握Android中动画的基本概念及分类 Ø ...
- 巧用Word通配符为英中双语字幕文件中的简体中文制作一份副本
今天接到一个需要简繁转写的字幕文件,是一个纯文本的Word文件,英中对照,带时间码.很小,只有10几行.一开始,我还以为只需将各简体中文行替换为繁体中文即可,结果再一问客户,是要保留已有两种文字的字幕 ...
- vue中过渡动画(类名实现方式)
vue中过渡动画分为两类,一类是进场动画,一类是出场动画 要实现上面的进场动画,主要有三种方式:类名,css动画库,js函数 类名 本质就是动态添加类名实现动画 在进入/离开的过渡中,会有 6 个 c ...
- 在Flash CS6中安装动画辅助制作插件DragonBones
提示:本文后面提供的附件是我从网络上搜索到的一个相当不错的针对Flash CS 6.0的扩展插件,它是在原有的Dragonbone 2.0的基础上作了适当修改,以便导致更多类型的符合COCOS2D-X ...
- figma下载_通过构建7个通用UI动画来掌握Figma中的动画
figma下载 Originally published on my personal blog. 最初发布在我的 个人博客上 . Most designers will spend many hou ...
- JavaFX官方教程(八)之JavaFX中的动画和视觉效果
翻译自 JavaFX中的动画和视觉效果 您可以使用JavaFX快速开发具有丰富用户体验的应用程序.在本入门教程中,您将学习如何使用非常少的编码创建动画对象并获得复杂的效果. 图7-1显示了要创建的应 ...
- 跟着石头哥哥学cocos2d-x(四)--cocos2dx中的动画以及TexturePacker使用
2019独角兽企业重金招聘Python工程师标准>>> 之前向Andreas Loew申请了一枚TexturePacker注册码,很快都下来了,作为回报我打算还是写一篇关于Textu ...
- vue3 中使用动画技术
vue3 中使用动画技术 作者: jcLee95 邮箱 :291148484@163.com CSDN 主页:https://blog.csdn.net/qq_28550263?spm=1001.21 ...
最新文章
- Nginx 作为web server 的优化要点
- 混合云是企业IT的未来吗?
- 脑电分析系列[MNE-Python-4]| MNE中数据结构Evoked及其对象创建
- 蓝牙HCI剖析(三)
- Linux kernel 3.10内核源码分析--slab原理及相关代码
- 计算机一级单元格公式设置错误是什么原因,excel表格公式出错怎么解决,电子表格求和出错...
- C语言 | 变量的存储方式
- 三维重建中旋转矩阵与平移矩阵思想误区(转载)
- 设计模式学习笔记——桥接(Bridge)模式
- 开源docker管理平台rancher 安装部署
- DOM中cloneNode的使用之旅
- 网页小工具(学习中国象棋)
- linux系统如何更改输入法切换快捷键,linux中什么快捷键可实现中英文的切换
- 论文阅读_ICD编码_MSMN
- Depends简介与使用说明
- LaTeX beamer中minipage添加脚注(footnote)
- 性能测试中设计性能场景
- JD京东爬虫-商品评论爬虫-----附源码
- android中使用hbuilder混合开发中提示未添加plugintest模块 请参考283
- Echarts点击事件
热门文章
- Windos系统只在重启时会蓝屏,开关机正常
- 计算机考研408每日一题 day45
- html5利用websocket完成的推送功能(tomcat)
- 计算机改变了我们的生活英语作文带翻译,关于未来生活的高中英语作文带翻译...
- 实验十(课程资源)-DNS服务器配置与管理
- ros里Catkin的CMakelists/package.xml
- 商标注册需要什么资料?注册商标需要多久时间
- go语言中func后、函数名前的参数作用
- AG1280Q48 Q32
- FFMpeg.AutoGen+D2D解码并播放视频(含音频流)