Cocos2d-x——CocosBuilder官方幫助文檔翻譯1 使用自定義類

原創:請註明轉載!node

在Cocos2d-x中使用CocosBuilderapp

 

使用自定義類iphone

CocosBuilder的使用方法是經過自定義類。在CocosBuilder中選中一個對象並在屬性欄中輸入自定義類的類名就能夠了。記住你的自定義類必須是你選中對象的一個子類(如CCLayer,CCNode等等)ide

當加載ccbi文件時,你須要定義兩個自定義類(也能夠是一個)。自定義的Loader類繼承自cocos2d::extension::CCLayerLoader。函數

自定義的Layer類繼承自
cocos2d::extension::CCBSelectorResolver
cocos2d::extension::CCBMemberVariableAssigner
cocos2d::extension::CCNodeLoaderListenerui

在你的自定義Loader類中你須要加入初始化代碼:this

public:spa

    CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(CustomLayerLoaderClass, loader);設計

    CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(CustomLayerClass));orm

使用Loader類的loader方法,CCBReader能夠初始化你的自定義Layer類。

 

 

請注意CCBReader不會使用任何自定義的init方法。若是要使用自定義的init方法,你能夠在自定義Layer類的構造函數中調用。

 

關聯成員變量

在ccbi中引用的對象能夠在文件被加載時關聯爲成員變量。這些成員變量能夠定義在文檔的根節點中,在這種狀況下它必須分配一個自定義類。

 

關聯成員變量很簡單,只要在頭文件中聲明它們就能夠了。

若是要初始化成員變量,你能夠在自定義Layer類中重載onAssignCCBMemberVariable方法並輸入代碼:

CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "sprtBurst", CCSprite *, this->mSprtBurst);


sprtBurst是在CocosBuilder中定義的屬性名。

在CocosBuilder中選擇對象,在Code Connections面板下把Don't assign變爲Doc root var或者Owner var。而後在右邊的文本框中輸入成員變量的名字。

 

添加CCMenuItemImage的回調函數

爲CCMenuItemImage添加一個點擊事件的回調函數很簡單,在CocosBuilder中選中CCMenuItemImage,在Selector右邊的文本框中輸入方法的名稱便可,並設置target爲Document root或者Owner。

 

回調函數將把CCMenuItemImage做爲它的惟一參數(參數類型是id,名稱通常是sender)。或者你也能夠忽略這個參數。

在你的自定義類中,重載onResolveCCBCCMenuItemSelector方法並添加以下代碼:

CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "pressedA:", MenuTestLayer::onMenuItemAClicked);

 

在這個方法中,MenuTestLayer是你的自定義類名。

而後在你的cpp文件中,能夠編寫回調方法

void MenuTestLayer::onMenuItemAClicked(cocos2d::CCObject *pSender) {

 

}

 

 

添加CCControl的回調函數

爲CCControl添加一個回調方法和CCMenuItemImage基本相同,只須要加一些額外的東西。

 

首先勾選事件類型,CCControlButton通常的事件都是Up inside。Target右邊的下拉菜單選擇Document root或者Owner,而後輸入回調方法名。這個回調方法能夠有兩個參數,sender和事件類型,事件類型被定義在CCControl.h中。

在自定義類中,重載onResolveCCBCCControlSelector方法並加入以下代碼:

CCB_SELECTORRESOLVER_CCCONTROL_GLUE(this, "pressedMenus:", MenuTestLayer::onPressedMenus);

 

在這個方法中,MenuTestLayer是你的自定義類名。

而後在你的cpp文件中,能夠編寫回調方法

void HelloCocosBuilderLayer::onMenuTestClicked(CCObject * pSender, cocos2d::extension::CCControlEvent pCCControlEvent) {

}

 

 

加載ccb文件的選項

在加載CocosBuilder的文件前,CocosBuilder文檔或者ccb文件須要以一種壓縮的二進制格式發佈——ccbi格式,一旦被髮布,只要一行代碼就能夠簡單地把它們加載到你的程序中。添加CCBReader.h 和 CCBReader.m文件到你的Cocos2D項目中(Cocos2d-x不用添加這些文件),而後調用nodeGraphFromFile方法,以下所示:

CCBReader *ccbReader = new cocos2d::extension::CCBReader(ccNodeLoaderLibrary);

CCNode* myNode = ccbReader->readNodeGraphFromFile("MyNodeGraph.ccbi");

 

ccNodeLoaderLibrary的初始化有兩種方法:

若是你使用的是自定義類,那麼:

CCNodeLoaderLibrary * ccNodeLoaderLibrary = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();
ccNodeLoaderLibrary->registerCCNodeLoader("HelloCocosBuilderLayer", HelloCocosBuilderLayerLoader::loader());

在這種狀況下,HelloCocosBuilderLayer是在CocosBuilder中指定的自定義類名。

 

若是沒有使用自定義類,你能夠初始化一個默認的NodeLoader

CCNodeLoaderLibrary * ccNodeLoaderLibrary = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();

 

根據ccbi文件中根節點的對象類型你須要對返回值作一下強制類型轉換。好比,若是你加載的是一個CCParticleSystem,那麼你須要以下代碼:

CCParticleSystem* myParticles = (CCParticleSystem*) ccbReader->readNodeGraphFromFile("MyParticleSystem.ccbi");

 

爲了方便起見,CCBReader還能夠把你的節點圖打包在一個場景中,而後調用sceneWithNodeGraphFromFile方法:

CCScene* myScene = ccbReader->sceneWithNodeGraphFromFile("MyScene.ccbi");

 

 

傳遞Owner變量

有時你可能須要訪問另外一個對象中的成員變量或者回調函數,而不是訪問根節點中的變量和函數。這樣的話,你就須要給CCBReader傳遞一個Owner參數。記住在CocosBuilder中聲明變量或者回調函數的時候Target選擇owner選項。而後調用CCBReader類的nodeGraphFromFile(file, owner)方法或者sceneWithNodeGraphFromFile(file, owner)方法來加載你的文件。

 

HelloCocosBuilderLayer *pOwner = new HelloCocosBuilderLayer();

CCNode* myNode = ccbReader->readNodeGraphFromFile("MyNodeGraph.ccbi", pOwner);

 

 

訪問子ccb文件中的變量和回調函數

若是你使用了子ccb文件,而且指定root node做爲目標,那麼owner target就是你要傳給CCBReader的對象。

 

示例

請參看HelloCocosBuilderLayer.h, HelloCocosBuilderLayer.cpp,還有cocos2d-x官方包下面的TestCPP項目中的ExtensionsTest示例。

 

設置縮放和設計尺寸

基於CocosBuilder的cocos2d-x項目,在AppDelegate類中對遊戲尺寸的適配進行了設置,它會自動地從相應的目錄中加載相應的資源文件。它的原理是基於設備屏幕的大小。你一樣須要對縮放係數和設計分辨率這兩個參數進行設置。

豎屏模式下,在AppDelegate.cpp的AppDelegate::applicationDidFinishLaunching方法中加入代碼:

CCSize designSize = CCSizeMake(320, 480);

CCSize resourceSize = CCSizeMake(320, 480);

CCSize screenSize = CCEGLView::sharedOpenGLView()->getFrameSize();

 

std::vector<std::string> searchPaths;

std::vector<std::string> resDirOrders;

 

TargetPlatform platform = CCApplication::sharedApplication()->getTargetPlatform();

if (platform == kTargetIphone || platform == kTargetIpad)

{

    searchPaths.push_back("Published-iOS"); // Resources/Published-iOS

    CCFileUtils::sharedFileUtils()->setSearchPaths(searchPaths);

 

    if (screenSize.height > 768)

    {

        resourceSize = CCSizeMake(1536, 2048);

        resDirOrders.push_back("resources-ipadhd");

    }

    else if (screenSize.height > 640)

    {

        resourceSize = CCSizeMake(768, 1536);

        resDirOrders.push_back("resources-ipad");

    }else if (screenSize.height > 480)

    {

        resourceSize = CCSizeMake(640, 960);

        resDirOrders.push_back("resources-iphonehd");

    }

    else

    {

        resDirOrders.push_back("resources-iphone");

    }

 

    CCFileUtils::sharedFileUtils()->setSearchResolutionsOrder(resDirOrders);

}

else if (platform == kTargetAndroid || platform == kTargetWindows)

{

 

    if (screenSize.height > 960)

    {

        resourceSize = CCSizeMake(640, 960);

        resDirOrders.push_back("resources-large");

    }

    else if (screenSize.height > 480)

    {

        resourceSize = CCSizeMake(480, 720);

        resDirOrders.push_back("resources-medium");

    }

    else

    {

        resourceSize = CCSizeMake(320, 568);

        resDirOrders.push_back("resources-small");

    }

 

    CCFileUtils::sharedFileUtils()->setSearchResolutionsOrder(resDirOrders);

}

 

pDirector->setContentScaleFactor(resourceSize.width/designSize.width);

 

CCEGLView::sharedOpenGLView()->setDesignResolutionSize(designSize.width, designSize.height, kResolutionShowAll);

 

若是是橫屏的模式,你只須要把分辨率寬高的順序調整一下就行了。好比(320, 480)變爲(480,320),(640, 960)變爲(960, 640)等等。

相關文章
相關標籤/搜索