您的位置:首页 > 移动开发 > Cocos引擎

Cocos骨骼动画

2016-03-28 16:17 218 查看



生成骨骼动画的软件:Spine或者cocosStudio

我们就是用做好的资源来做骨骼动画的(骨骼动画由几个描述文件和一张资源图片组成)

首先,必须加入头文件:#include
"spine/spine-cocos2dx.h"

然后,可以使用(创建骨骼对象):

spine::SkeletonAnimation* ske = spine::SkeletonAnimation::createWithFile("spine/spineboy.json",
"spine/spineboy.atlas", 0.4f); 参数3默认是1,骨骼对象没有create函数,只能直接文件创建
addChild(ske);

可以让骨骼动画动起来

spTrackEntry* entry =ske->addAnimation(1,
"run", true); //参数1是编号,参数2是动画的名称(该名称不是随便起的,是来自于.json文件中以及命名好的动作名称,参数3为是否循环,参数4是延时,默认是0
ske->setPosition(winSize.width/ 2, 0);

其实可以将骨骼动画认为是自带动画的精灵。但是骨骼动画一般是不求其boundingBox的,因为老是在动,往往大小不一(虽然是可以求出来的,但是必须在动画运行一段时间之后才行)

显示骨骼线条:ske->setDebugBonesEnabled(true);

引发另一个动作

这里用到了前面addAnimation中的参数1——编号,必须给不同的动作编不同的编号。否则相同编号会互相覆盖。

接下来做一个触摸引发另一动作:

auto ev =
EventListenerTouchOneByOne::create();
ev->onTouchBegan= [&](Touch*,
Event*)
{spine::SkeletonAnimation*node = (spine::SkeletonAnimation*)this->getChildByTag(100);
node->addAnimation(2,
"shoot", false);
//这次动画不再循环,从这里能看出骨骼动画的节点性质
Rect rc =node->getBoundingBox();};
this->_eventDispatcher->addEventListenerWithSceneGraphPriority(ev,this);

骨骼动画事件(监听):监听骨骼动画的行为————主要是为了针对动作做一些处理

每一个事件都是在.json文件中已经定义好的事件,甚至都有命名

通过如下骨骼对象方法:

void setStartListener(const StartListener&listener);
void setEndListener(const EndListener&listener);
voidsetCompleteListener(constCompleteListener& listener);
void setEventListener(const
EventListener& listener);

对应参数都是模板函数指针:其trackIndex就是前面提到的动画编号(表示这个事件是由哪个动画触发的)

typedef std::function<void(int trackIndex)>
StartListener;
typedef std::function<void(int trackIndex)>
EndListener;
typedef std::function<void(int trackIndex,
int loopCount)>
CompleteListener;
typedef std::function<void(int trackIndex,
spEvent* event)>
EventListener;

具体使用:

ske->setStartListener([](int
trackIndex)开始时调用
{CCLOG("track index =%d startListener", trackIndex);});

ske->setEndListener([](int
trackIndex)结束时调用
{CCLOG("track index =%d setEndListener", trackIndex)});

ske->setCompleteListener([](int
trackIndex, int loopCount)完成时调用
{CCLOG("track index =%d setCompleteListener, loopCount=%d", trackIndex,loopCount);});

EventListener 则是每当触发任何一个事件便会触发这个事件。但是前提是这个动作在.JSON中定义了事件监听。
ske->setEventListener([](int
trackIndex, spEvent*
event)
{CCLOG("track index =%d setEventListener name=%s", trackIndex,
event->data->name); });
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: