【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、示例效果图。