文章撰寫日期︰2013/04/10 15:30 cocos2dx使用版本︰v 2.0.4 cocosBuilder使用版本︰v 2.0 alpha 1
一、前言
我們知道,在cocos2dx的世界,
是以CCNode(節點)為概念,
遊戲畫面可以藉由一層一層的堆疊,
來做出完整的畫面呈現,
更棒的是,
分層式的概念,
在程式碼的分類上,
給了我們很好的管理空間。
最常見的CCLayer,
就是很常被我們使用的CCNode。
而cocosBuiler也使用了相同概念,
讓我們能將ccbi(cocosBuilder製作出來的圖層檔)藉由CCBReader產生成CCLayer。
有了這個方便管理的分層概念,
我們當然不要放過。
今天,
我有一頁遊戲主頁A,
上面希望壓一層玩家的遊戲狀態B,
因此我們很容易去聯想到︰
我要畫面A+B=C。
然後,各自管理各個畫面裡的變數或元件。
要怎麼做?
二、本文
cocosBuilder要做的事sub ccb只能自訂義class來接收cocosBuilder裡定義的物件 |
否則會遇到我之前提的sub ccbi執行起來的位置不在你指定的位置上,
產生偏移的問題。
Target設成Document root(一定要!) |
將sub ccb檔拖曳至主ccb裡 |
這樣子我們就完成了在cocosBuilder裡的屬性變數定義。
接下來,
我們把目光往cocos2d-x裡瞧。
我們需要建立CCBReader的Loader, 也就是要將cocos2d-x和cocosBuilder做綁定,
所以這個Loader裡, 將會定義cocosBuilder裡的變數的工作為何。
這是HeaderLayer.h檔
#ifndef _HEADERLAYER_H_ #define _HEADERLAYER_H_ #include "cocos2d.h" #include "cocos-ext.h" class HeaderLayer : public cocos2d::CCLayer , public cocos2d::extension::CCBSelectorResolver { public: CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(HeaderLayer, create); virtual cocos2d::SEL_MenuHandler onResolveCCBCCMenuItemSelector(cocos2d::CCObject * pTarget, cocos2d::CCString * pSelectorName); virtual cocos2d::extension::SEL_CCControlHandler onResolveCCBCCControlSelector(cocos2d::CCObject * pTarget, cocos2d::CCString * pSelectorName); void onHeadIconPressed(cocos2d::CCObject * pSender); }; class HeaderLayerLoader : public cocos2d::extension::CCLayerLoader { public: CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(HeaderLayerLoader, loader); protected: CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(HeaderLayer); }; #endif這是HeaderLayer.cpp檔
#include "HeaderLayer.h" USING_NS_CC; USING_NS_CC_EXT; SEL_MenuHandler HeaderLayer::onResolveCCBCCMenuItemSelector(CCObject * pTarget, CCString * pSelectorName) { return NULL; } SEL_CCControlHandler HeaderLayer::onResolveCCBCCControlSelector(CCObject * pTarget, CCString * pSelectorName) { CCB_SELECTORRESOLVER_CCCONTROL_GLUE(this, "onHeadIconPressed", HeaderLayer::onHeadIconPressed); return NULL; } void HeaderLayer::onHeadIconPressed(cocos2d::CCObject *pSender) { // CCDirector::sharedDirector()->popScene(); CCLog("into onHeadIconPressed"); }
我們看到了在
SEL_CCControlHandler HeaderLayer::onResolveCCBCCControlSelector(CCObject * pTarget, CCString * pSelectorName) { CCB_SELECTORRESOLVER_CCCONTROL_GLUE(this, "onHeadIconPressed", HeaderLayer::onHeadIconPressed); return NULL; } }裡面,我們實作了剛才在cocosBuilder裡定義的︰
小綠人的按鈕按下後,要做onHeadIconPressed函式裡要做的事。
而onHeadIconPressed函式要做的事很簡單,
印出LOG而己。
void HeaderLayer::onHeadIconPressed(cocos2d::CCObject *pSender) { CCLog("into onHeadIconPressed"); } }
將cocosBuilder的變數與cocos2d-x綁定後,
再來就是很單純的將這個圖層檔(ccbi)讓cocos2d-x裡的extension\CCBReader元件載入
//這是遊戲主頁面類的scene函式 CCScene* SchoolMapScene::scene(){ CCScene* scene = CCScene::create(); //原本遊戲主頁用到的ccbi CCNodeLoaderLibrary *ll = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary(); ll->registerCCNodeLoader("SchoolMapScene", SchoolMapSceneLayerLoader::loader()); //為了要能使用sub-ccbi的元件,需要多註冊HeaderLayer這組Loader ll->registerCCNodeLoader("HeaderLayer", HeaderLayerLoader::loader()); CCBReader *ccbReader = new CCBReader(ll); mAnimationManager = NULL; CCNode *node = ccbReader->readNodeGraphFromFile("SchoolMap.ccbi",this,&mAnimationManager); mAnimationManager->setDelegate(this); //获取AnimationManger 并传给AnimationsLayer ((SchoolMapScene*)(node))->setAnimationManager(ccbReader->getAnimationManager()); ccbReader->autorelease(); if(node != NULL) { scene->addChild(node); } return scene; }
完成後,
我們就能同時監聽2層ccbi圖層的點擊事件,
而不同圖層的管理,
也很明確的區分出來,
彼此不衝突,
遊戲狀態圖層還能任意被任何其它遊戲畫面使用。
三、結論
經由cocosBuilder的設定和cocos2d-x的綁定,我們很有邏輯的將各個圖層該有什麼功能做了很有效率的分類了。
以後如果要改遊戲狀態圖層B的內容,
也完全不會和原本的遊戲主頁面A扯上關係,
這就是使用sub ccbi的好處。
還在等什麼,
快點試看看!
四、後記
官方也有Sub ccb使用的Sample︰TestCpp專案裡有Sample範例,相關Class請參照
cocos2dx/samples/TestCpp//Classes/ExtensionsTest/CocosBuilderTest資料夾,
而使用到的cocosbuilder專案檔則放在
cocos2dx/samples/TestCpp/Resources/CocosBuilderExample.ccbproj
如果有安裝cocosBuilder,
點2下就能開起來了。
相關文章
1. [cocosBuilder篇]sub ccbi在主ccbi上位置偏移2. [cocosbuilder篇]Reference to 'CCBReader' is ambiguous錯誤
3. 官方sub ccbi使用教學(英文)
4. Android端無法載入sub ccb
5. ccbi檔讀取遇到BAD_ACCESS
6. [cocos2d-JSB/cocosBuilder篇]在當前ccb取得sub ccb裡的物件或函式
沒有留言 :
張貼留言