[cocosbuilder篇]sub ccbi的使用

文章撰寫日期︰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裡的物件或函式

沒有留言 :

張貼留言