Cocos2d-x 中的 ActionManager 統一管理節點上的所有動作(Action),提供暫停、繼續、停止特定動作、延遲執行等進階控制。本文透過實例詳解核心用法。
節點本身提供 stopAllActions(),會立即停止該節點上目前正在執行的所有動作,但不影響後續新增的動作。
node->stopAllActions(); // 停止現有動作
node->runAction(ScaleTo::create(2, 2)); // 此動作正常執行
無直接 API 實現「延遲 N 秒執行某動作」,可結合 schedule 與 pauseTarget/resumeTarget 達成:
pauseTarget 暫停該節點。schedule 設定定時器,時間到時呼叫 resumeTarget 並取消定時器。auto action = MoveBy::create(1, Vec2(150,0));
director->getActionManager()->addAction(action, grossini, true); // true 表示不自動啟動
schedule(schedule_selector(PauseTest::unpause), 3); // 3 秒後觸發 unpause
void PauseTest::unpause(float dt) {
unschedule(schedule_selector(PauseTest::unpause));
auto node = getChildByTag(98);
director->getActionManager()->resumeTarget(node); // 開始執行動作
}
給動作設定 tag,再透過 stopActionByTag(tag) 精準停止。
auto pSequence = Sequence::create(pMove, pCallback, nullptr);
pSequence->setTag(kTagSequence); // 設定 tag
pChild->runAction(pSequence);
// 稍後停止
sprite->stopActionByTag(kTagSequence);
pauseTarget(node) 暫停節點上所有動作(含未完成與後續新增),resumeTarget(node) 繼續執行。實測:pauseTarget 後再 runAction,新動作也不會立即執行,需 resumeTarget 後才會一併運行。
director->getActionManager()->pauseTarget(pGrossini); // 暫停
pGrossini->runAction(RotateBy::create(2, 360)); // 此動作暫緩執行
schedule(schedule_selector(ResumeTest::resumeGrossini), 3.0f);
void ResumeTest::resumeGrossini(float dt) {
unschedule(schedule_selector(ResumeTest::resumeGrossini));
director->getActionManager()->resumeTarget(pGrossini); // 所有動作恢復執行
}
掌握 ActionManager 可實現精細的動作控制:stopAllActions 清場、tag 精準刪除、pause/resumeTarget 實現延遲與暫停續傳,是遊戲邏輯開發的關鍵工具。