文章撰寫日期︰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的念頭。

沒有留言 :
張貼留言