【Cocos2d-X开发学习笔记】第19期:动作管理类(CCActionManager)的使用

 本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010

 

 

 

一、动作管理类

 

      动作管理类CCActionManager是一个管理所有动作的单例,工作原理是:当CCNode执行runAction时,该函数会

动作通过动作管理类的addAction函数将对象传递给CCActionManager的单例,该实例再把这个动作添加到自己的

动作序列中。

      动作管理单例通过定时刷新自己的update方法,在这个方法中去调用行为序列中每个动作的step(暂停的行为不

会update),这些step方法再根据自身的完成进度去update或是结束行为。

      实际上是由动作管理单例驱动的每个动作去更新自己的逻辑,而runAction方法只是将行为对象添加进

CCActionManager的待执行队列。当节点被清除或是行为结束时,动作管理类会自动将动作从队列中删除,不需要程

员的管理。

      一般情况下,不需要使用这个单例来管理动作,可以使用CCNode类的stopAction、stopActionByTag和

stopActions等函数来管理、但是有两种情况需要使用CCActionManager类单例:

<1> 动作的执行者不是同一个节点。

<2> 需要暂停/重启活动时。

 

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

 

 

二、CCActionManager类的主要函数

 

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

 

 

 

三、CCActionManager类的使用

 

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

启动作时使用。

 

1、项目示例。

 

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

void resumeGrossini(float time);

 

<2> 在HelloWorldScene.cpp文件中的init函数中添加如下所示代码。

bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {
        CC_BREAK_IF(! CCLayer::init());

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

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

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

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

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

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

        bRet = true;
    } while (0);

    return bRet;
}

 

<3> 最后在HelloWorldScene.cpp文件中添加如下所示函数。

void HelloWorld::resumeGrossini(float time)
{
    this->unschedule(schedule_selector(HelloWorld::resumeGrossini));

    CCNode* pGrossini = getChildByTag(1);
    CCDirector* pDirector = CCDirector::sharedDirector();
    pDirector->getActionManager()->resumeTarget(pGrossini);
}

     首先获得导演实例,然后通过调用getActionManager获得动作管理,再通过pauseTarget和resumeTarget等函数

实现暂停/重启目标的动作。

 

 

2、示例效果图。

 

                      

 

 

 

 

源码下载地址

 

posted @ 2013-08-17 22:46  pangbangb  阅读(385)  评论(0编辑  收藏  举报