文章撰寫日期︰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的念頭。
沒有留言 :
張貼留言