前面講過Node的動作(Action),cocos2d-x中,提供了一個ActionManger,用於管理Action的一些動作,比如停止,暫停等;
一、停止所有動作
實際上,Node節點已經有了一些簡單的動作的管理,比如停止Node實例上的所有動作;
node->stopAllActions(); //
node->runAction(ScaleTo::create(2, 2))
調用node->stopAllActions(); 之前的所有動作都將停止,但是,它並影響後續的動作,後續的ScaleTo動作將正常執行;
二、延時執行動作
cocos2d-x中,並沒有簡單的使用一個接口直接指定某一個動作延時一段時間後執行,但是,這都不是問題,下面是一個延時3s執行動作的例子;
auto grossini = Sprite::create(s_pathGrossini);
addChild(grossini, 0, 98); // 為sprite指定一個tag
grossini->setPosition(VisibleRect::center() );
auto action = MoveBy::create(1, Vec2(150,0));
auto director = Director::getInstance();
director->getActionManager()->addAction(action, grossini, true);
schedule( schedule_selector(PauseTest::unpause), 3); // 每3秒執行一次unpause方法;
unpause方法實現
unschedule( schedule_selector(PauseTest::unpause) ); // 停止循環執行unpause方法
auto node = getChildByTag( 98); // 獲取sprite實例
auto director = Director::getInstance();
director->getActionManager()->resumeTarget(node); // 開始執行動作
上面的例子通過schedule循環更新的方法,每3s執行一次,當執行的時候,就取消循環來實現動作延時執行的效果;
三、停止動作
void StopActionTest::onEnter()
{
auto pMove = MoveBy::create(2, Vec2(200, 0));
auto pCallback = CallFunc::create(CC_CALLBACK_0(StopActionTest::stopAction,this));
auto pSequence = Sequence::create(pMove, pCallback, NULL);
pSequence->setTag(kTagSequence); // 為動作指定tag
auto pChild = Sprite::create(s_pathGrossini);
pChild->setPosition( VisibleRect::center() );
addChild(pChild, 1, kTagGrossini);
pChild->runAction(Sequence::create(ScaleTo::create(3.0f,2.0f), NULL));
pChild->runAction(pSequence);
}
void StopActionTest::stopAction() // 停止動作
{
auto sprite = getChildByTag(kTagGrossini); // 通過tag獲取sprite
sprite->stopActionByTag(kTagSequence); // 停止sprite上的指定的tag的動作
}
停止Node的某一個動作簡單來說,就是預先給動作指定一個tag,在要停止它的時候,通過stopActionByTag(tag)來停止它;
四、Resume動作
void ResumeTest::onEnter()
{
auto pGrossini = Sprite::create(s_pathGrossini);
addChild(pGrossini, 0, kTagGrossini);
pGrossini->setPosition(VisibleRect::center());
pGrossini->runAction(ScaleBy::create(2, 2));
auto director = Director::getInstance();
director->getActionManager()->pauseTarget(pGrossini);// @1
pGrossini->runAction(RotateBy::create(2, 360));
this->schedule(schedule_selector(ResumeTest::resumeGrossini), 3.0f);
}
void ResumeTest::resumeGrossini(float time)
{
this->unschedule(schedule_selector(ResumeTest::resumeGrossini));
auto pGrossini = getChildByTag(kTagGrossini);
auto director = Director::getInstance();
director->getActionManager()->resumeTarget(pGrossini);
}
@1:在上面的代碼中,pauseTarget方法調用之後,又再次調用了runAction,那它會不會先執行這個動作呢?實際上,是不會的(親測),所以,我大膽的解釋為pauseTarget之後,需要調用resumeTarget之後,才會執行Node實例自身的未完成的動作;
完!