分享

Cocos2d-x之动作管理与CCActionManager的使用

 怎么了啊早上 2014-03-22

Cocos2d-x之动作管理与CCActionManager的使用



一、动作管理类

      动作管理类CCActionManager是一个管理所有动作的单例,工作原理是:当CCNode执行runAction时,该函数会
把动作通过动作管理类的addAction函数将对象传递给CCActionManager的单例,该实例再把这个动作添加到自己的
动作序列中。
      动作管理单例通过定时刷新自己的update方法,在这个方法中去调用行为序列中每个动作的step(暂停的行为不
update),这些step方法再根据自身的完成进度去update或是结束行为。
      实际上是由动作管理单例驱动的每个动作去更新自己的逻辑,而runAction方法只是将行为对象添加进
CCActionManager的待执行队列。当节点被清除或是行为结束时,动作管理类会自动将动作从队列中删除,不需要程
序员的管理。
      一般情况下,不需要使用这个单例来管理动作,可以使用CCNode类的stopActionstopActionByTag
stopActions等函数来管理、但是有两种情况需要使用CCActionManager类单例:


<1> 动作的执行者不是同一个节点。
<2> 需要暂停/重启活动时。

CCActionManager类的继承关系如下图所示。


61.png

二、CCActionManager类的主要函数

CCActionManager类的主要函数见如下图所示。


62.png



三、CCActionManager类的使用

       之前提到过,不要轻易使用动作管理类,除非是不同动作目标和需要暂停/重启动作。这里的例子就是需要暂停/
重启动作时使用。

1、项目示例。

<1> 首先新建Cocos2D-X项目,取名为“MyCCActionManager”,然后在HelloWorldScene.h文件中声明成员函数。

  1. void resumeGrossini(float time);  
复制代码


<2> HelloWorldScene.cpp文件中的init函数中添加如下所示代码。
  1. bool HelloWorld::init()
  2. {
  3.     bool bRet = false;
  4.     do
  5.     {
  6.         CC_BREAK_IF(! CCLayer::init());

  7.                 //获得尺寸大小
  8.                 CCSize s = CCDirector::sharedDirector()->getWinSize();

  9.                 //添加标签
  10.         CCLabelTTF* l = CCLabelTTF::create("Grossini only rotate/scale in 3 seconds", "Thonburi", 16);
  11.                 addChild(l);
  12.                 l->setPosition(ccp(s.width/2, s.height/2 + 120));

  13.                 //添加精灵
  14.                 CCSprite* pGrossini = CCSprite::create("grossini.png");
  15.                 addChild(pGrossini, 0, 1);
  16.                 pGrossini->setPosition(ccp(s.width/2, s.height/2));

  17.                 //精灵执行动作
  18.                 pGrossini->runAction(CCScaleBy::create(2, 2));

  19.                 CCDirector* pDirector = CCDirector::sharedDirector();
  20.                 pDirector->getActionManager()->pauseTarget(pGrossini);
  21.                 pGrossini->runAction(CCRotateBy::create(2, 360));

  22.                 this->schedule(schedule_selector(HelloWorld::resumeGrossini), 3.0f);

  23.         bRet = true;
  24.     } while (0);

  25.     return bRet;
  26. }
复制代码


<3> 最后在HelloWorldScene.cpp文件中添加如下所示函数。
  1. void HelloWorld::resumeGrossini(float time)
  2. {
  3.     this->unschedule(schedule_selector(HelloWorld::resumeGrossini));

  4.     CCNode* pGrossini = getChildByTag(1);
  5.     CCDirector* pDirector = CCDirector::sharedDirector();
  6.     pDirector->getActionManager()->resumeTarget(pGrossini);
  7. }
复制代码



首先获得导演实例,然后通过调用getActionManager获得动作管理,再通过pauseTargetresumeTarget等函数
实现暂停/重启目标的动作。

<4> 停止此动作,开始下一个动作
63.gif

64.gif

其中在onEnter的最后一句话就是在1.4s后调用removeThis这个函数来进行把这一层删掉,并且开始下一层,可以看到,这个runAction是这个层对象调用的。
回调函数处理子精灵
65.gif
66.gif


如果不想对整个层操作,而是对层中的精灵操作呢?这回调函数使用callfuncN_selector即可
动作挂起

67.gif
68.gif


以上函数可以实现一个动作挂起,如果再扩展,就可以实现动作冷却,通过调用schedule函数来实现在30s后通过CCActionManager开始动作(需要unschedule




2、示例效果图。
效果图1.png


效果图2.png

参考代码: MyCCActionManager.rar (222.74 KB, 下载次数: 13)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多