首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

cocos2d-x 核心機制深度解析:Action 系統之 Instant Actions (立即動作) 與 Callback 封裝

     編輯:關於C語言

Action 系統總覽

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

CCAction 繼承體系簡圖

Instant Actions (立即動作) - CCActionInstant 家族

不需時間、即刻完成的動作,基類 CCActionInstant。常用子類:

  • CCFlipX/CCFlipY:X/Y 軸翻轉
  • CCHide/CCShow/CCToggleVisibility:顯隱控制
  • CCPlace:瞬間移動到指定座標

用法極簡,node->runAction(CCFlipX::create()) 即可。

核心重點:CCCallFunc 家族 — 回調函數包裝器

將成員函數包裝成 Action,使其能融入動作序列 (Sequence) 中執行。四大類對應四種簽名:

類別靜態建構函數對應回調簽名轉換巨集
CCCallFuncactionWithTarget(target, callfunc_selector(Class::func))void func()callfunc_selector
CCCallFuncNactionWithTarget(target, callfuncN_selector(Class::func))void func(CCNode* sender)callfuncN_selector
CCCallFuncNDactionWithTarget(target, callfuncND_selector(Class::func), void* data)void func(CCNode* sender, void* data)callfuncND_selector
CCCallFuncOactionWithTarget(target, callfuncO_selector(Class::func), CCObject* obj)void func(CCObject* obj)callfuncO_selector

實戰範例:角色死亡動畫播完 → 切換 GameOver 場景

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));
}

原理解析:execute() 內部機制

void CCCallFunc::execute() {
    if (m_pCallFunc) {
        (m_pSelectorTarget->*m_pCallFunc)(); // 呼叫成員函數指標
    }
    // Lua/JS 腳本引擎支援略...
}

關鍵區別:m_pSelectorTarget (函數所屬對象) 與 m_pTarget (動作執行節點) 可不同,極大提升靈活度。

使用時的三要素對應檢查

  1. 類別:CCCallFunc / N / ND / O
  2. 回調函數簽名:無參 / CCNode* / CCNode*, void* / CCObject*
  3. 轉換巨集: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 封裝,即掌握了將任意遊戲邏輯編織進動作時間軸的鑰匙。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved