[cocos2dx]使用virtual關鍵字

文章撰寫日期︰2013/08/13 12:30
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、前文

今天想要使用virtual關鍵字宣告抽象實作函式,
發現了一些狀況。

二、文章開始

遇到了什麼狀況?

1.cocos2dx官網已經明確的告訴我們不要隨便使用virtual關鍵字。


2.稍微理解一下virtual這個關鍵字在cocos2dx裡的被使用狀態︰

CCNode裡如virtual void onEnter()等抽象實作函式之所以能呼叫到子CCNode的onEnter()是因為CCNode的onEnter()使用了一個宏/巨集︰
void CCNode::onEnter()
{
    //就是這個
    arrayMakeObjectsPerformSelector(m_pChildren, onEnter, CCNode*);

    this->resumeSchedulerAndActions();

    m_bIsRunning = true;

    if (m_eScriptType != kScriptTypeNone)
    {
        CCScriptEngineManager::sharedManager()->getScriptEngine()->executeNodeEvent(this, kCCNodeOnEnter);
    }
}

這個宏/巨集被宣告在CCArray.h中︰

#define arrayMakeObjectsPerformSelector(pArray, func, elementType)    \
do {                                                                  \
    if(pArray && pArray->count() > 0)                                 \
    {                                                                 \
        CCObject* child;                                              \
        CCARRAY_FOREACH(pArray, child)                                \
        {                                                             \
            elementType pNode = (elementType) child;                  \
            if(pNode)                                                 \
            {                                                         \
                pNode->func();                                     \
            }                                                         \
        }                                                             \
    }                                                                 \
}                                                                     \
while(false)

當每一個CCLayer向CCScene添增子節點(this->addChild(node))後,
這個宏會將所有收到的子節點
都跑一次onEnter這個被強制規範要實作的函式。
也因此,
我們客製化的CCLayer::onEnter()能夠被呼叫到。

如果要這樣使用,
你的架構需改寫。

3.你宣告岀來的class需要繼承CCObject,
否則會遇到
CCAssert(0, "not implement");

這個錯誤。

三、結論

以上種種原因,
寫了這篇部落格打消使用virtual的念頭。

沒有留言 :

張貼留言