2015/05/13

需求:

(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)
{
int argc = ;
cocostudio::Bone* cobj = nullptr;
bool ok = true; #if COCOS2D_DEBUG >= 1
tolua_Error tolua_err;
#endif #if COCOS2D_DEBUG >= 1
if (!tolua_isusertype(tolua_S,,"ccs.Bone",,&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);
return ;
}
#endif argc = lua_gettop(tolua_S)-;
if (argc == )
{
if(!ok)
return ;
cocos2d::Vec2 ret = cobj->getBonePosition();
vec2_to_luaval(tolua_S, ret);
return ;
}
CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "getBonePosition",argc, );
return ; #if COCOS2D_DEBUG >= 1
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_Bone_getBonePosition'.",&tolua_err);
#endif return ;
}

(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);
return cocos2d::Vec2(, );
}

导出后的c++代码如下,同样的可以自己写:

int lua_cocos2dx_spine_Skeleton_getBonePosition(lua_State* tolua_S)
{
int argc = ;
spine::Skeleton* cobj = nullptr;
bool ok = true; #if COCOS2D_DEBUG >= 1
tolua_Error tolua_err;
#endif #if COCOS2D_DEBUG >= 1
if (!tolua_isusertype(tolua_S,,"sp.Skeleton",,&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);
return ;
}
#endif argc = lua_gettop(tolua_S)-;
if (argc == )
{
const char* arg0; std::string arg0_tmp; ok &= luaval_to_std_string(tolua_S, , &arg0_tmp); arg0 = arg0_tmp.c_str();
if(!ok)
return ;
cocos2d::Vec2 ret = cobj->getBonePosition(arg0);
vec2_to_luaval(tolua_S, ret);
return ;
}
CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "getBonePosition",argc, );
return ; #if COCOS2D_DEBUG >= 1
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_spine_Skeleton_getBonePosition'.",&tolua_err);
#endif return ;
}

(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();
float vertices[];
for (int i = ; 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加载骨骼动画,获取骨骼位置的更多相关文章

  1. CSS3实现加载数据动画1

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. [Swift通天遁地]五、高级扩展-(11)图像加载Loading动画效果的自定义和缓存

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. WPF加载等待动画

    原文:WPF加载等待动画 原文地址:https://www.codeproject.com/Articles/57984/WPF-Loading-Wait-Adorner 界面遮罩 <UserC ...

  4. js判断图片加载完成后获取图片实际宽高

    通常,我们会用jq的.width()/.height()方法获取图片的宽度/高度或者用js的.offsetwidth/.offsetheight方法来获取图片的宽度/高度,但这些方法在我们通过样式设置 ...

  5. HTML5+javascript实现图片加载进度动画效果

    在网上找资料的时候,看到网上有图片加载进度的效果,手痒就自己也写了一个. 图片加载完后,隐藏loading效果. 想看加载效果,请ctrel+F5强制刷新或者清理缓存. 效果预览:   0%   // ...

  6. 纯css3 加载loading动画特效

    最近项目中要实现当页面还没有加载完给用户提示正在加载的loading,本来是想做个图片提示的,但是图片如果放大电脑的分辨率就会感觉到很虚,体验效果很不好.于是就采用css3+js实现这个loading ...

  7. Android 自定义View修炼-自定义加载进度动画XCLoadingImageView

    一.概述 本自定义View,是加载进度动画的自定义View,继承于ImageView来实现,主要实现蒙层加载进度的加载进度效果. 支持水平左右加载和垂直上下加载四个方向,同时也支持自定义蒙层进度颜色. ...

  8. jQuery:实现图片按需加载的方法,当要显示内容的高度超过了页面的高度,按需加载,根据滚动条的位置来判断页面显示的内容

    实现图片按需加载的方法,当要显示内容的高度超过了页面的高度,按需加载,根据滚动条的位置来判断页面显示的内容 这个类似于京东或淘宝页面,根绝页面的滚动,显示下面的内容 如下图所示,一开始并不是所有的图片 ...

  9. Android酷炫加载进度动画

    概述 本自定义动画进度酷炫View,是加载进度动画的自定义View,继承于ImageView来实现,主要实现蒙层加载进度的加载进度效果. 支持水平左右加载和垂直上下加载四个方向,同时也支持自定义蒙层进 ...

随机推荐

  1. 爱奇艺视频显示列表CSS实现

    css: body{margin:0;font-size: 12px;font-family: "宋体":} ul{margin:0;padding:0;list-style: n ...

  2. WPF 使用附加属性增加控件属性

    使用附加属性增加控件属性,使得这个附加属性在使用的时候没有局限性,可以在任何的控件中使用它来增加所需要的属性,使得控件的属性使用起来非常灵活 一.自定义附加属性 using System; using ...

  3. js处理json数据,java处理json数据

    一.js处理json数据 处理办法之一是把本机json数据或远程返回json数据用eval函数,使之变成DOM对象. 例如: var people = { "programmers" ...

  4. 师傅领进门之6步教你跑通一个AI程序!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云计算基础发表于云+社区专栏 源码下载地址请点击原文查看. 初学机器学习,写篇文章mark一下,希望能为将入坑者解点惑.本文介绍一些机 ...

  5. 嵌套div的margin-top不生效

    之前遇到过嵌套div设置margin-top不生效的情况,一直没去研究,今天又遇到了,查阅资料得知原因,并不是margin-top没生效,只是当外层容器跟内层容器之间没有别的元素的时候,内层容器的ma ...

  6. Diskrete Mathematik

    1.Aussagenlogik 1.1 Gleichwertiges Kalkül 1.2 Normalform Einfache Disjunktion besteht aus Disjunktio ...

  7. Docker学习之Docker容器基本使用

    Docker学习之Docker容器基本使用 新建容器并启动 命令格式:docker run --options repository:tag 后台运行 命令格式:-d 已存在的容器相关操作 启动:do ...

  8. zsh: command not found: gulp

    明明安装了gulp,但是为什么执行gulp命令却在控制台输出 zsh: command not found: gulp 可能因为gulp没有被全局安装 在控制台输入 which gulp 如果输出 g ...

  9. Cheatsheet: 2017 06.01 ~ 06.30

    .NET Porting a .NET Framework library to .NET Core Performance Improvements in .NET Core High-perfor ...

  10. [javaSE] 集合框架(迭代器)

    当我们创建一个集合以后,可以直接使用system.out.println()来打印这个集合,但是,我们需要可以对每个元素进行操作,所以,这里需要使用迭代器来遍历集合 迭代器其实就是集合取出元素的方式 ...