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. 零拷贝概念 -- linux内核

    零拷贝(zero-copy) 备快速网络接口的主要技术. 零拷贝技术通过降低或消除关键通信路径影响速率的操作,降低传输数据的操作系统开销和协议处理开销,从而有效提高通信性能,实现快速传输数据. 零拷贝 ...

  2. 3. QT窗体间值的传递(续)

    一.前言 上篇博客中通过重载子窗体的构造函数将主窗体的值传入到子窗体,但是在子窗体运行过程中如何才能将值动态的传入到子窗体?可以有两种办法,1.信号和槽的方式传值:2.主窗体中将传出值设置为publi ...

  3. MVC View基础(转)

    View主要用于呈现数据.由于Controller和相关的Service已经处理完业务逻辑并将结果打包成model实体,View只需要怎么去获得model并将其转为Html 1选择需要渲染的视图 在上 ...

  4. UIScrollView 滑动试图

    UIScrollView --->UIView //创建UIScrollView testScrollView=[[UIScrollView alloc]init]; testScrollVie ...

  5. ActiveMQ持久化消息(转)

    ActiveMQ的另一个问题就是只要是软件就有可能挂掉,挂掉不可怕,怕的是挂掉之后把信息给丢了,所以本节分析一下几种持久化方式: 一.持久化为文件 ActiveMQ默认就支持这种方式,只要在发消息时设 ...

  6. 跨平台渲染框架尝试 - constant buffer的管理

    1. Preface Constant buffer是我们在编写shader的时候,打交道最多的一种buffer resource了.constant表明了constant buffer中的数据,在一 ...

  7. JavaScript中的作用域链原理

    执行环境 作用域链的形成与执行环境(Execution Environment)相关,在JavaScript当中,产生执行环境有如下3中情形: 1 进入全局环境 2 调用eval函数 3 调用func ...

  8. [ofbiz]设置任务计划(job),提示service_item已经传递

    问题描述:设置任务计划(job),提示service_item已经传递 解决办法: 红色框内不要填写,就可以了."已经传递"是翻译的不准确,应该是"已过时",所 ...

  9. CSS3动画之无缝滚动

    与js的无缝滚动类似,整个承载图片的盒子移动,克隆一组图片放置最后,当一组图片播放结束后将盒子定位在有一组图片宽度的左侧 HTML结构: <div class="box"&g ...

  10. 转:Linux中find命令-path -prune用法详解

    在Windows中可以在某些路径中查找文件,也可以设定不在某些路径中查找文件,下面用Linux中的find的命令结合其-path -prune参数来看看在Linux中怎么实现此功能. 假如在当前目录下 ...