程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Cocos2d-x 動作的管理之ActionManger

Cocos2d-x 動作的管理之ActionManger

編輯:C++入門知識

前面講過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實例自身的未完成的動作;

完!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved