Cocos骨骼动画

本文介绍了如何在Cocos2d-x中使用Spine或cocosStudio创建骨骼动画,包括添加头文件、创建骨骼对象、播放动画、设置动画事件监听以及响应触摸事件来切换动画。详细阐述了各个步骤和关键函数的使用,如`setDebugBonesEnabled`、`addAnimation`等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


生成骨骼动画的软件: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); });

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值