CocosBuilder能方便的编辑各种动画。大部分动画都是以独立片段的形式存在的。

须要由程序来控制何时播放。

管理ccbi文件的动画播放有个专门的类:CCBAnimationManager

大致的逻辑是这种:

全部的动画以动作的形式存在一个CCArray中。

这个ActionManager管理这些动作。

我们如今想做的无非两件事:控制播放动作,当动作结束时得到通知。

我们在cocosBuilder中设置的默认动作。是当Scene层的OnEnter载入完毕,就会播放的。

因此要对当中的元素改动,应在onEnter中进行。

好。如今我们面临的第一个问题是当第一个动作结束时,我怎样知道?

在这个类中有这样一个函数:

  1. void setAnimationCompletedCallback(CCObject *target, SEL_CallFunc callbackFunc);

我们能够这样用:

  1. m_AnimationManager->setAnimationCompletedCallback(this,callfunc_selector(CCBABC::ThisIsCallBack));

回调函数定义例如以下:

  1. void ThisIsCallBack();

这样当第一个动作运行完,就会调用这个函数。

即使你有一个CCSquence。

比方,在cocosBuilder设置了动画链,它也是会被调用的。你唯一要注意的是。这个注冊必须在动作结束之前。

好。以下的第二个问题,怎样让下一个动作执行。

  1. void runAnimationsForSequenceNamedTweenDuration(const char *pName, float fTweenDuration);
  2. void runAnimationsForSequenceNamed(const char *pName);
  3. void runAnimationsForSequenceIdTweenDuration(int nSeqId, float fTweenDuraiton);

相同是在CCBAnimationManager中,它们是播放动画的方法。

name即是你在cocosBuilder起的动画名称。fTweenDuration是两个动画之间的间隔。中间那个函数表示没有间隔。

所以,我们能够这样用:

  1. void CCBAbc::ThisIsCallBack()
  2. {
  3. //do some change
  4. //......
  5. mAnimationManager->setAnimationCompletedCallback(this,callfunc_selector(CCBAbc::showOutCallBack));
  6. mAnimationManager->runAnimationsForSequenceNamed("showOut");
  7. }

这样我们就能将一串动作串起来了!

知道了怎么控制动画之后。还有个问题,就是怎样把cbbi的CCBAnimationManager找到呢?

这就要从extensions\CCBReader\CCNodeLoader.cpp这个文件说起了。

当调用CCBReader::readNodeGraph方法是。会Load对应的Node。当中会调用:

  1. CCNode * CCNodeLoader::loadCCNode(CCNode * pParent, CCBReader * pCCBReader) {
  2. CCNode * ccNode = this->createCCNode(pParent, pCCBReader);
  3. //this->parseProperties(ccNode, pParent, pCCBReader);
  4. return ccNode;
  5. }

这种方法。可见由ccbi文件读进来的每个元素,都是通过Loader中的这种方法创建的。

这种方法是什么?

  1. #define CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(T) virtual T * createCCNode(cocos2d::CCNode * pParent, cocos2d::extension::CCBReader * pCCBReader) { \
  2. return T::create(); \
  3. }

就是创建一个CCNode而已。

我们要做的就是重写这种方法,原理是由于我们要调用CCBReader中的getAnimationManager()这种方法。将得到的manager保存到一个私有变量中就成了。

我这个写到宏里了,凑合看吧  哈

  1. virtual T* createCCNode(cocos2d::CCNode * pParent, cocos2d::extension::CCBReader * pCCBReader)        \
  2. {        \
  3. T * pRet = new T();        \
  4. if (pRet && pRet->init())        \
  5. {        \
  6. pRet->autorelease();        \
  7. pRet->setAnimationManager( pCCBReader->getAnimationManager() );        \
  8. }        \
  9. else        \
  10. {        \
  11. CC_SAFE_DELETE(pRet);        \
  12. }        \
  13. return pRet;        \
  14. }        \

当中setAnimationManager保存了这个值。

ok。这样一来就能够操作cbbi中的AnimationManager了,当然也就能够自由控制动画的流程啦~



转自http://blog.csdn.net/fansongy/article/details/8937210

Cocos2d-x游戏开发CCBAnimationManager控制动画的更多相关文章

  1. iOS cocos2d 2游戏开发实战(第3版)书评

    2013是游戏爆发的一年,手游用户也是飞速暴增.虽然自己不做游戏,但也是时刻了解手机应用开发的新动向.看到CSDN的"写书评得技术图书赢下载分"活动,就申请了一本<iOS c ...

  2. 【读书笔记《Android游戏编程之从零开始》】16.游戏开发基础(动画)

    1. Animation动画   在Android 中,系统提供了动画类 Animation ,其中又分为四种动画效果: ● AlphaAnimation:透明度渐变动画 ● ScaleAnimati ...

  3. [libGDX游戏开发教程]使用libGDX进行游戏开发(12)-Action动画

    前文章节列表:  使用libGDX进行游戏开发(11)-高级编程技巧   使用libGDX进行游戏开发(10)-音乐音效不求人,程序员也可以DIY   使用libGDX进行游戏开发(9)-场景过渡   ...

  4. Android游戏开发研究帧动画实现

     1.动画的原则框架        帧的动画帧的动画顾名思义,画就是帧动画. 帧动画和我们小时候看的动画片的原理是一样的,在同样区域高速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,事实上只 ...

  5. Unity游戏开发——自动为动画剪辑添加事件 之 最后几帧的事件不能被调用的问题

    最近在做一个根据配置表自动生成动画剪辑clip以及controller的功能.做法是根据配置表配置的动作以及每个动作的关键帧,自动为每个clip添加事件.这样做可以把动画的事件处理在游戏运行之前就计算 ...

  6. Html5游戏开发-图形与动画(一)

    最近研究了一下出来了很久的HTML5,总结了一下,准备来个系列,文中也许有很多问题,欢迎大家指正. Canvas介绍 canvas用于在网页中绘制图形的一个元素,具体内容请查看 -> HTML5 ...

  7. (转载)如何学好iphone游戏开发

    转自:http://www.cnblogs.com/zilongshanren/archive/2011/09/19/2181558.html 自从发布<如何学习iphone游戏开发>到 ...

  8. 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:/ ...

  9. 《MFC游戏开发》笔记五 定时器和简单动画

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9332377 作者:七十一雾央 新浪微博:http:// ...

随机推荐

  1. mbed OS - ARM关于物联网(IoT)的战略布局

    关于IoT 在刚刚过去的ARMTECHCON2014(Santa Clara Convention Center)第1天会议,首要的keynote就是ARM针对建立物联网(InternetOf Thi ...

  2. HDU 1863:畅通project(带权值的并查集)

    畅通project Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  3. AfxBeginThread的介绍/基本用法

    AfxBeginThread    用户界面线程和工作者线程都是由AfxBeginThread创建的.现在,考察该函数:MFC提供了两个重载版的AfxBeginThread,一个用于用户界面线程,另一 ...

  4. Python 线程(threading) 进程(multiprocessing)

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  5. SQL SERVER 自定义函数 split

    Create function [dbo].[split] ( ), ) ) )) as begin declare @i int set @SourceSql=rtrim(ltrim(@Source ...

  6. 在Java中编写带占位符的SQL语句

    C#中SQL中带占位符的语句 假设有一张学员信息表Student,通过表中的ID来找学员,查询的SQL语句如下 string sql = string.Format("select * fr ...

  7. libxml两种换行方法

    好久没上来留下一些记录了,可能是太忙,又或者是过于慵懒便疏于整理. libxml是一个开源的库,linux下解析xml文件经常用到,进行一些创读增删的操作. 最开始接触的时候,看到了一个简明易懂的&l ...

  8. 编译错误“The run destination My Mac 64-bit is not valid for Running the scheme '***',解决办法

    1. iOS APP Project or  Mac APP Project编译错误提示:
“The run destination My Mac 64-bit is not valid for Ru ...

  9. UGUI学习之InputField

    密码框在Context type 设置为Passwold 设置背景和调整字体颜色与透明度. 还有一个就是Toggle,(开关)要指定他的Graphic.

  10. WCF入门教程系列二

    一.概述 WCF能够建立一个跨平台的安全.可信赖.事务性的解决方案,是一个WebService,.Net Remoting,Enterprise Service,WSE,MSMQ的并集,有一副很经典的 ...