之前的一博客空間到期沒有備份,丟失了一些資料。以下僅僅通過搜素引擎找回的一些東東!
首先知道Cocos2D項目:
在Cocos2D項目中加載ccb文件:在加載CocosBuilder的文件 前,CocosBuilder文檔或者ccb文件需要以一種壓縮的二進制各式發布——即ccbi文件。一旦被發布為ccbi文件,則只需要一行代碼即可簡 單地加載到具體的Cocos2D工程項目中(前提保證已經將CCBReader.h和CCBReader.m文件添加到項目中):
CCBReader *ccbReader = new cocos2d::extension::CCBReader(ccNodeLoaderLibrary); CCNode *myNode = ccbReader->readNodeGraphFromFile("MyNodeGraph.ccbi");
Cocos2D-X項目中又是如何加載ccb文件?
Cocos2D-X中針對CocosBuilder的解析器CCBReader(位於extensions/CCBReader目錄下,且與CocosBuilder的版本有關系:CocosBuilder v2.1版本發布的文件,對於Cocos2D-X v2.1.1及低版本都不支持。因此無須再添加CCBReader.h和CCBReader.m這兩個iOS特有的文件。),由於C++沒有像Objective-C的動態特性,所以集成CCBReader的代碼並沒有如Cocos2D中的簡單。
CCBReader的原理
ccbi文件其實對應了4類Cocos2D-X對象,一個ccbi文件,包含了此對象的一些屬性信息。CCBReader讀取了這個 ccbi文件,就清楚了這個對象的一切。這個時候,要把這些信息和我們的代碼聯系起來,就需要用到CCNodeLoaderLibrary來聯系咱自定義 的類,接着把這個信息拋給CCBReader,由其進行關聯。具體代碼如下:
CCNodeLoaderLibrary *ccNodeLoaderLibrary = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary(); ccNodeLoaderLibrary->registerCCNodeLoader("Intro", IntroLoader::loader()); /* Create an autorelease CCBReader */ cocos2d::extension::CCBReader *ccbReader = new cocos2d::extension::CCBReader(ccNodeLoaderLibrary); /* Read a ccbi file. */ CCNode *node = ccbReader->readNodeGraphFromFile("MainScene.ccbi"); ccbReader->release(); CCScene *scene = CCScene::create(); scene->addChild(node);
默認情況下,ccbi對應了Cocos2D-X的4個類型之一,如果要對應咱自定義的類型(從那4個類型中派生出來的),我們要在CocosBuilder中的根對象命名,如下圖:
選擇CCLayer,在右側的Custom class中填寫Intro。(如果是Custom class顯示為JS Controller,點擊菜單Document/JavaScript Controlled,去掉其選項)。這個就可以理解上面的代碼了:
CCNodeLoaderLibrary *ccNodeLoaderLibrary = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();
ccNodeLoaderLibrary->registerCCNodeLoader(“Intro”, IntroLoader::loader());
上述例子中,IntroLoader對象就負責加載相關的類Intro。
可知:CCBReader進行ccbi和自定義類的關聯的過程如下,CCBReader一邊解析ccbi文件,一邊調用自定義類的onResolveCCBCCMenuItemSelector等方法;在這些回調方法中,可以進行相關的綁定工作,如對象綁定、CCMenuItem selector的綁定等。更多綁定細則,可以查看CocosBuilder中的幫助。
就是說,如果用Objective-C就比較方便,由於其動態性,可以根據名稱自動反射;而C++則需要手動綁定,繁瑣些,不過為了CocosBuilder帶來方便,這個也是值得的。