Cocos骨骼动画
2016-03-28 16:17
218 查看
我们就是用做好的资源来做骨骼动画的(骨骼动画由几个描述文件和一张资源图片组成)
首先,必须加入头文件:#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); });
相关文章推荐
- Cocos动画
- cocos动作使用示例(3)
- cocos动作使用示例(2)
- cocos动作使用示例(1)
- Cocos动作(3)
- Cocos动作(2)
- Cocos动作(1)
- Cocos进度条和批处理渲染
- Cocos节点的生命周期
- 绘制——如何在cocos中画画
- Cocos节点
- Cocos缓存的实现
- Cocos精灵帧缓存
- Cocos纹理缓存
- 【cocos2d-x制作别踩白块儿】第一期:游戏介绍
- cocos2dx3.3 CCNotificationCenter观察者模式
- [Cocos2d-x v3.x官方文档]精灵帧缓存(SpriteFrameCache)
- Cocos2d-x LoadingBar(进度条)的使用
- cocos2d-x触摸事件优先级的探究与实践
- [Cocos2d-x v3.x官方文档]纹理缓存