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. Top 15 Tools To Make Animated GIFs From Images & Video

    Creating an animated GIF picture from photos or video with Adobe Photoshop is easy, but not everyone ...

  2. 浅谈jquery关于select框的取值和赋值

    浅谈jquery关于select框的取值和赋值   jQuery("#select_id").change(function(){}); // 1.为Select添加事件,当选择其 ...

  3. Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6666491 在前面一篇文章Android系统匿 ...

  4. MySql命令——命令行客户机的分隔符

    delimiter // create procedure productpricint() begin select avg(price) as priceaverage from product; ...

  5. JQuery.validate在ie8下不支持解决方案

    一.在ie8下回有问题的代码 1.JQuery.validate验证框架是通过页面form表单提交验证<input/>标签中输入是否符合自己的规则的 <form id="c ...

  6. javascript 阻止多次点击造成的轮播混乱

    function nextSlider(){ //使用b作为开关,只有动画完成后才能进行下一次运动 if(b){ //如果b为真,则马上设置b为false,如果startmove的回调没有重新设置b的 ...

  7. fullcalendar .net版本

    实现了基本的增删改和拖拽,先记与此,抽时间继续优化和完善. 参考链接:http://www.helloweba.com/tag-fullcalendar.html 参考demo:   http://f ...

  8. 获取UILabel上最后一个字符串的位置。获取文字长度和高度,自动换行

    //行的高度. -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPat ...

  9. setTimeout的时间设为0的问题

    javascript是单线程执行的,当某一段代码正在执行的时候,所有的后续任务都必须等待,形成一个队列, 一旦当前任务执行完毕,再从队列中取出下一个任务.这常被称为”阻塞式执行“. 如果代码中设定一个 ...

  10. 从Ecipse中导出程序至apk

    若未有数字证书: 1. 2. 3. 4. 5. 若已有数字证书: 上面的后3步改为