Action 是 cocos2d-x 遊戲邏輯的靈魂。所有動作繼承自 CCAction,由節點 (CCNode) 執行:node->runAction(action)。父節點執行動作時,所有子節點會跟著執行,這特性極利於場景級協同動畫。

不需時間、即刻完成的動作,基類 CCActionInstant。常用子類:
CCFlipX/CCFlipY:X/Y 軸翻轉CCHide/CCShow/CCToggleVisibility:顯隱控制CCPlace:瞬間移動到指定座標用法極簡,node->runAction(CCFlipX::create()) 即可。
將成員函數包裝成 Action,使其能融入動作序列 (Sequence) 中執行。四大類對應四種簽名:
| 類別 | 靜態建構函數 | 對應回調簽名 | 轉換巨集 |
|---|---|---|---|
CCCallFunc | actionWithTarget(target, callfunc_selector(Class::func)) | void func() | callfunc_selector |
CCCallFuncN | actionWithTarget(target, callfuncN_selector(Class::func)) | void func(CCNode* sender) | callfuncN_selector |
CCCallFuncND | actionWithTarget(target, callfuncND_selector(Class::func), void* data) | void func(CCNode* sender, void* data) | callfuncND_selector |
CCCallFuncO | actionWithTarget(target, callfuncO_selector(Class::func), CCObject* obj) | void func(CCObject* obj) | callfuncO_selector |
CCAction* seq = CCSequence::actions(
getDeathAnimate(), // 取得死亡動畫 Action
CCCallFunc::actionWithTarget(this, // 目標對象
callfunc_selector(Hero::onDeathComplete)), // 回調
NULL);
this->runAction(seq);
// 回調實作
void Hero::onDeathComplete() {
this->setIsVisible(false); // 標記隱藏,讓引擎自動清理
CCScene* scene = GameOverScene::scene();
CCDirector::sharedDirector()->replaceScene(
CCTransitionFade::transitionWithDuration(1.2f, scene));
}
void CCCallFunc::execute() {
if (m_pCallFunc) {
(m_pSelectorTarget->*m_pCallFunc)(); // 呼叫成員函數指標
}
// Lua/JS 腳本引擎支援略...
}
關鍵區別:m_pSelectorTarget (函數所屬對象) 與 m_pTarget (動作執行節點) 可不同,極大提升靈活度。
CCCallFunc / N / ND / OCCNode* / CCNode*, void* / CCObject*callfunc_selector / N / ND / O三者必須一一對應,否則編譯錯誤或執行期崩潰。
// 1. 無參
runAction(CCCallFunc::create(this, callfunc_selector(A::f1)));
// 2. 取得執行節點
runAction(CCCallFuncN::create(this, callfuncN_selector(A::f2)));
// 3. 攜帶 void* 參數
int i = 42;
runAction(CCCallFuncND::create(this, callfuncND_selector(A::f3), &i));
// 4. 攜帶 CCObject*
CCObject* obj = ...;
runAction(CCCallFuncO::create(this, callfuncO_selector(A::f4), obj));
掌握 Callback 封裝,即掌握了將任意遊戲邏輯編織進動作時間軸的鑰匙。