cocos2dx加载骨骼动画,获取骨骼位置
需求:
(1)希望在骨骼上绑定一个粒子特效
(2)获取骨骼的位置
(3)获取骨骼动画的大小
(4)lua
1. cocostudio动画编辑器
(1)绑定粒子特效(跟随骨骼的移动移动)
- local boneNew = ccs.Bone:create("particle")
- boneNew:addDisplay(particle, )
- --设置是否跟随骨骼一起移动
- boneNew:setIgnoreMovementBoneData(true)
- --显示骨骼上绑定的内容(这里是粒子特效,换装也是同样的接口)
- boneNew:changeDisplayWithIndex(, true)
- --设置层级关系
- boneNew:setLocalZOrder()
- --Layer22为骨骼动画中想绑定的骨骼,设置为该骨骼为粒子特效所在骨骼的父骨骼
- armature:addBone(boneNew, "Layer22")
* 其他的和骨骼的绑定也是通过此方式实现,感觉比较好用
(2)获取骨骼位置
修改源代码,从getWorldInfo中获取数据,在Bone类中加一个接口
- cocos2d::Vec2 Bone::getBonePosition() const
- {
- BaseData *pData = getWorldInfo();
- return Vec2(pData->x, pData->y);
- }
使用tolua++导出来之后如下(当然,自己也可以写一个,就不用导出来这个步骤了):
- int lua_cocos2dx_studio_Bone_getBonePosition(lua_State* tolua_S)
- {
- ;
- cocostudio::Bone* cobj = nullptr;
- bool ok = true;
- #if COCOS2D_DEBUG >= 1
- tolua_Error tolua_err;
- #endif
- #if COCOS2D_DEBUG >= 1
- ,,&tolua_err)) goto tolua_lerror;
- #endif
- cobj = (cocostudio::Bone*)tolua_tousertype(tolua_S,,);
- #if COCOS2D_DEBUG >= 1
- if (!cobj)
- {
- tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_Bone_getBonePosition'", nullptr);
- ;
- }
- #endif
- argc = lua_gettop(tolua_S)-;
- )
- {
- if(!ok)
- ;
- cocos2d::Vec2 ret = cobj->getBonePosition();
- vec2_to_luaval(tolua_S, ret);
- ;
- }
- CCLOG();
- ;
- #if COCOS2D_DEBUG >= 1
- tolua_lerror:
- tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_Bone_getBonePosition'.",&tolua_err);
- #endif
- ;
- }
(3)获取骨骼动画大小
cocostudio导出来加载后的Armature本身就是一个node,直接getContentSize就可以了。但是spine的动画就不行,getContentSize的结果为0,要使用别的接口,看下面。
2. spine动画编辑器
(1)绑定粒子特效(跟随骨骼的移动移动)
没有办法做到,但是可以通过获取骨骼的位置之后,添加一个特效到整个骨骼动画的这个位置上,不过是不能跟随骨骼一起移动的,一起移动看到有两种方法,不过都没有试过,就先记录在这里,想用再来试一下
* update函数每帧获取骨骼的位置,把粒子特效重现设置位置
参考:[1]
* 重写spine骨骼的的接口,每个骨骼和一个node对应
参考:[2]
(2)获取骨骼位置
同studio(因为lua没有导出函数接口),修改代码,导出lua,在类中增加一个函数:
- Vec2 Skeleton::getBonePosition(const char* boneName) const
- {
- spBone *pBone = findBone(boneName);
- if (pBone)
- return cocos2d::Vec2(pBone->worldX, pBone->worldY);
- , );
- }
导出后的c++代码如下,同样的可以自己写:
- int lua_cocos2dx_spine_Skeleton_getBonePosition(lua_State* tolua_S)
- {
- ;
- spine::Skeleton* cobj = nullptr;
- bool ok = true;
- #if COCOS2D_DEBUG >= 1
- tolua_Error tolua_err;
- #endif
- #if COCOS2D_DEBUG >= 1
- ,,&tolua_err)) goto tolua_lerror;
- #endif
- cobj = (spine::Skeleton*)tolua_tousertype(tolua_S,,);
- #if COCOS2D_DEBUG >= 1
- if (!cobj)
- {
- tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_spine_Skeleton_getBonePosition'", nullptr);
- ;
- }
- #endif
- argc = lua_gettop(tolua_S)-;
- )
- {
- const char* arg0;
- std::, &arg0_tmp); arg0 = arg0_tmp.c_str();
- if(!ok)
- ;
- cocos2d::Vec2 ret = cobj->getBonePosition(arg0);
- vec2_to_luaval(tolua_S, ret);
- ;
- }
- CCLOG();
- ;
- #if COCOS2D_DEBUG >= 1
- tolua_lerror:
- tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_spine_Skeleton_getBonePosition'.",&tolua_err);
- #endif
- ;
- }
(3)获取骨骼动画大小
这个比较重要!!不能使用接口getContentSize,得出来的是0,但是Skeleton类提供了另外一个接口,也导出了lua接口:
- Rect Skeleton::getBoundingBox () const {
- float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN;
- float scaleX = getScaleX();
- float scaleY = getScaleY();
- ];
- ; i < skeleton->slotCount; ++i) {
- spSlot* slot = skeleton->slots[i];
- if (!slot->attachment || slot->attachment->type != ATTACHMENT_REGION) continue;
- spRegionAttachment* attachment = (spRegionAttachment*)slot->attachment;
- spRegionAttachment_computeWorldVertices(attachment, slot->skeleton->x, slot->skeleton->y, slot->bone, vertices);
- minX = min(minX, vertices[VERTEX_X1] * scaleX);
- minY = min(minY, vertices[VERTEX_Y1] * scaleY);
- maxX = max(maxX, vertices[VERTEX_X1] * scaleX);
- maxY = max(maxY, vertices[VERTEX_Y1] * scaleY);
- minX = min(minX, vertices[VERTEX_X4] * scaleX);
- minY = min(minY, vertices[VERTEX_Y4] * scaleY);
- maxX = max(maxX, vertices[VERTEX_X4] * scaleX);
- maxY = max(maxY, vertices[VERTEX_Y4] * scaleY);
- minX = min(minX, vertices[VERTEX_X2] * scaleX);
- minY = min(minY, vertices[VERTEX_Y2] * scaleY);
- maxX = max(maxX, vertices[VERTEX_X2] * scaleX);
- maxY = max(maxY, vertices[VERTEX_Y2] * scaleY);
- minX = min(minX, vertices[VERTEX_X3] * scaleX);
- minY = min(minY, vertices[VERTEX_Y3] * scaleY);
- maxX = max(maxX, vertices[VERTEX_X3] * scaleX);
- maxY = max(maxY, vertices[VERTEX_Y3] * scaleY);
- }
- Vec2 position = getPosition();
- return Rect(position.x + minX, position.y + minY, maxX - minX, maxY - minY);
- }
说明:
* 返回四个值:x, y, height, width
* 说明:(x, y)左下角的坐标,相对于rootbone的原点;height, width就是整个骨骼动画的大小
* rootbone可以理解为cocos里面的锚点
* 【重要】在调用该接口之前,需要调用update接口初始化一遍数据,不然也是没有数据的,参考[3]
3. 总结
(1)获取位置都是需要新加接口的
(2)虽然spine编辑器要好用,但是对于程序来说spine绑定特效还没有cocostudio方便
(3)cocostudio的位置最好不要直接拿来用,例如转换为全局坐标,最好直接addBone的方式
(4)spine的坐标也是直接骨骼动画addChild
4. 参考
[1]http://www.cnblogs.com/mrblue/p/3414158.html
[2]http://blog.csdn.net/n5/article/details/21795265
[3]http://blog.csdn.net/wk3368/article/details/38903095
cocos2dx加载骨骼动画,获取骨骼位置相关推荐
- Android加载Gif动画android-gif-drawable的使用
Android加载Gif动画android-gif-drawable的使用 目前支持Gif播放的开源库还是有的,不过经分析: GifView:如果Gif图片太大会导致OOM; SimpleDrawee ...
- android刷新时的圆形动画_Android自定义加载圈动画效果
本文实例为大家分享了Android自定义加载圈动画展示的具体代码,供大家参考,具体内容如下 实现如下效果: 该效果图主要有3个动画: 1.旋转动画 2.聚合动画 3.扩散动画 以上3个动画都是通过Va ...
- [Swift通天遁地]五、高级扩展-(11)图像加载Loading动画效果的自定义和缓存
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- android 载入svg动画,Android 加载SVG动画
Android 加载SVG动画 SVG 可以说是目前比较流行的图片格式,使用领域也十分广泛,例如:web 前端页面,Android ios 等移动应用.都可以使用 SVG 的图片格式.今天就要和大家谈 ...
- android 图标弹跳动画,动效教程 | 5 分钟快速制作弹跳加载小动画
前言 今天墨染哥教你如何5分钟快速制作一个弹跳的加载小动画,如下图所示,这个小动画要快速做出来,需要解决解决两个技术难点,第一个是食物图标的弹跳,第二个是文本的弹跳. 食物图标的弹跳 话不多说,先看看 ...
- 简单的骨骼动画、骨骼动画理论
简单的骨骼动画.骨骼动画理论 Keep in touch: zpxocivuby@126.com 目的:指导别人使用矩阵 任务:编写教程,编写代码 阅读对象:d3d入门者,c/c++熟练,window ...
- MFC加载GIF动画
在一个项目中需要使用MFC直接加载GIF动画.加载GIF动画网上有多种方式,大多数是将GIF填进资源,使用PictureEx类load资源文件 如下: PictureEx图片显示类支持以下格式的图片 ...
- jsp预加载转圈_30种CSS3炫酷页面预加载loading动画特效(推荐)
这是一组效果非常炫酷的CSS3页面预加载loading动画特效.该特效共有30种不同的loading效果.所有的加载动画都是使用CSS3来完成,jQuery代码只是用于隐藏加载动画.当你点击页面的任何 ...
- android 图标弹跳动画,动效教程 | 5 分钟快速做个弹跳加载小动画
小编:APP的动效现今是越来越重要了,以前是加分项,现在是必会技能-今天给大家带来的是AE动效教程 -- 5 分钟快速做个弹跳加载小动画,一起来学习学习吧-- 前言 哈喽,今天给大家解禁一个墨染动效特 ...
最新文章
- linux 日志 停止滚动,linux – syslog在日志轮换后停止记录
- 转发:linux修改光盘作为源
- Unity HDRP中的光照烘焙测试(Mixed Lighing )和间接光
- Intellij IDEA中maven更新不下来pom中的jar包,reimport失效
- Nacos发布0.5.0版本,轻松玩转动态 DNS 服务
- 贵大计算机在职,贵州大学在职研究生招生信息网
- php168 的采集规则的改动
- geek软件是干什么的_详解强力卸载软件Geek Uninstaller使用教程
- js轮播图 最简单代码
- linux几个工具的安装
- webstorm+vue组件开发准备
- 二、鼎捷T100总账管理之核算项管理篇
- 【Python】日志关键字分析工具
- 字节跳动为什么选用Flutter:并非跨平台终极之选,但它可能是不一样的未来
- git init和git clone获取仓库 (一)
- 如何安装配置JDK(保姆级完美解决教程+附百度网盘链接)
- LeetCode Daily challenge - K Closest Points to Origin
- Linux Mint 18安装sougou拼音输入法
- 蓝牙BLE芯片PHY6222之烧录以及调试
- java访问linux中文文件乱码
热门文章
- 跟着王进老师学开发:Python初级入门课程-王进-专题视频课程
- A. Lightning Routing I 线段树维护树直径
- Linux挂载磁盘(扩展根目录)
- php 指纹登录,Thinkphp识别/指纹/搜集
- python pcm 静音_理解和使用alsa配置-默认静音,必须先用amixer解除主音量和pcm音量的静音 | 学步园...
- Mac OS X的火狐上安装Burp's CA Certificate
- ajax传参data里面的键是一个变量得解决方式
- 【解锁】flake8——python官方代码扫描工具
- python画卡通人物_python实现人像动漫化的示例代码
- CAN 报文字节排列顺序(Intel、Motorola_LSB、Motorola_MSB)