文章撰寫日期︰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裡定義的物件 |
Anchor point記得要設成x=0,y=0,
否則會遇到我之前提的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裡的物件或函式