日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

在Cocos2d-x中使用CocosBuilder

發(fā)布時(shí)間:2023/12/14 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在Cocos2d-x中使用CocosBuilder 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


在Cocos2d-x中使用CocosBuilder

?

使用自定義類(lèi)

CocosBuilder的使用方法是通過(guò)自定義類(lèi)。在CocosBuilder中選中一個(gè)對(duì)象并在屬性欄中輸入自定義類(lèi)的類(lèi)名就可以了。記住你的自定義類(lèi)必須是你選中對(duì)象的一個(gè)子類(lèi)(如CCLayer,CCNode等等)

當(dāng)加載ccbi文件時(shí),你需要定義兩個(gè)自定義類(lèi)(也可以是一個(gè))。自定義的Loader類(lèi)繼承自cocos2d::extension::CCLayerLoader。

自定義的Layer類(lèi)繼承自
cocos2d::extension::CCBSelectorResolver
cocos2d::extension::CCBMemberVariableAssigner?
cocos2d::extension::CCNodeLoaderListener

在你的自定義Loader類(lèi)中你需要加入初始化代碼:

public:

??? CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(CustomLayerLoaderClass, loader);

??? CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(CustomLayerClass));

使用Loader類(lèi)的loader方法,CCBReader可以初始化你的自定義Layer類(lèi)。

?

?

請(qǐng)注意CCBReader不會(huì)使用任何自定義的init方法。如果要使用自定義的init方法,你可以在自定義Layer類(lèi)的構(gòu)造函數(shù)中調(diào)用。

?

關(guān)聯(lián)成員變量

在ccbi中引用的對(duì)象可以在文件被加載時(shí)關(guān)聯(lián)為成員變量。這些成員變量可以定義在文檔的根節(jié)點(diǎn)中,在這種情況下它必須分配一個(gè)自定義類(lèi)。

?

關(guān)聯(lián)成員變量很簡(jiǎn)單,只要在頭文件中聲明它們就可以了。

如果要初始化成員變量,你可以在自定義Layer類(lèi)中重載onAssignCCBMemberVariable方法并輸入代碼:

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


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

在CocosBuilder中選擇對(duì)象,在Code Connections面板下把Don't assign變?yōu)镈oc root var或者Owner var。然后在右邊的文本框中輸入成員變量的名字。

?

添加CCMenuItemImage的回調(diào)函數(shù)

為CCMenuItemImage添加一個(gè)點(diǎn)擊事件的回調(diào)函數(shù)很簡(jiǎn)單,在CocosBuilder中選中CCMenuItemImage,在Selector右邊的文本框中輸入方法的名稱(chēng)即可,并設(shè)置target為Document root或者Owner。

?

回調(diào)函數(shù)將把CCMenuItemImage作為它的唯一參數(shù)(參數(shù)類(lèi)型是id,名稱(chēng)一般是sender)。或者你也可以忽略這個(gè)參數(shù)。

在你的自定義類(lèi)中,重載onResolveCCBCCMenuItemSelector方法并添加如下代碼:

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

?

在這個(gè)方法中,MenuTestLayer是你的自定義類(lèi)名。

然后在你的cpp文件中,可以編寫(xiě)回調(diào)方法

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

?

}

?

?

添加CCControl的回調(diào)函數(shù)

為CCControl添加一個(gè)回調(diào)方法和CCMenuItemImage基本相同,只需要加一些額外的東西。

?

首先勾選事件類(lèi)型,CCControlButton一般的事件都是Up inside。Target右邊的下拉菜單選擇Document root或者Owner,然后輸入回調(diào)方法名。這個(gè)回調(diào)方法可以有兩個(gè)參數(shù),sender和事件類(lèi)型,事件類(lèi)型被定義在CCControl.h中。

在自定義類(lèi)中,重載onResolveCCBCCControlSelector方法并加入如下代碼:

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

?

在這個(gè)方法中,MenuTestLayer是你的自定義類(lèi)名。

然后在你的cpp文件中,可以編寫(xiě)回調(diào)方法

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

}

?

?

加載ccb文件的選項(xiàng)

在加載CocosBuilder的文件前,CocosBuilder文檔或者ccb文件需要以一種壓縮的二進(jìn)制格式發(fā)布——ccbi格式,一旦被發(fā)布,只要一行代碼就可以簡(jiǎn)單地把它們加載到你的程序中。添加CCBReader.h 和 CCBReader.m文件到你的Cocos2D項(xiàng)目中(Cocos2d-x不用添加這些文件),然后調(diào)用nodeGraphFromFile方法,如下所示:

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

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

?

ccNodeLoaderLibrary的初始化有兩種方法:

如果你使用的是自定義類(lèi),那么:

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

在這種情況下,HelloCocosBuilderLayer是在CocosBuilder中指定的自定義類(lèi)名。

?

如果沒(méi)有使用自定義類(lèi),你可以初始化一個(gè)默認(rèn)的NodeLoader

CCNodeLoaderLibrary * ccNodeLoaderLibrary = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();

?

根據(jù)ccbi文件中根節(jié)點(diǎn)的對(duì)象類(lèi)型你需要對(duì)返回值做一下強(qiáng)制類(lèi)型轉(zhuǎn)換。比如,如果你加載的是一個(gè)CCParticleSystem,那么你需要如下代碼:

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

?

為了方便起見(jiàn),CCBReader還可以把你的節(jié)點(diǎn)圖打包在一個(gè)場(chǎng)景中,然后調(diào)用sceneWithNodeGraphFromFile方法:

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

?

?

傳遞Owner變量

有時(shí)你可能需要訪問(wèn)另一個(gè)對(duì)象中的成員變量或者回調(diào)函數(shù),而不是訪問(wèn)根節(jié)點(diǎn)中的變量和函數(shù)。這樣的話,你就需要給CCBReader傳遞一個(gè)Owner參數(shù)。記住在CocosBuilder中聲明變量或者回調(diào)函數(shù)的時(shí)候Target選擇owner選項(xiàng)。然后調(diào)用CCBReader類(lèi)的nodeGraphFromFile(file, owner)方法或者sceneWithNodeGraphFromFile(file, owner)方法來(lái)加載你的文件。

?

HelloCocosBuilderLayer *pOwner = new HelloCocosBuilderLayer();

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

?

?

訪問(wèn)子ccb文件中的變量和回調(diào)函數(shù)

如果你使用了子ccb文件,并且指定root node作為目標(biāo),那么owner target就是你要傳給CCBReader的對(duì)象。

?

示例

請(qǐng)參看HelloCocosBuilderLayer.h, HelloCocosBuilderLayer.cpp,還有cocos2d-x官方包下面的TestCPP項(xiàng)目中的ExtensionsTest示例。

?

設(shè)置縮放和設(shè)計(jì)尺寸

基于CocosBuilder的cocos2d-x項(xiàng)目,在AppDelegate類(lèi)中對(duì)游戲尺寸的適配進(jìn)行了設(shè)置,它會(huì)自動(dòng)地從相應(yīng)的目錄中加載相應(yīng)的資源文件。它的原理是基于設(shè)備屏幕的大小。你同樣需要對(duì)縮放系數(shù)和設(shè)計(jì)分辨率這兩個(gè)參數(shù)進(jìn)行設(shè)置。

豎屏模式下,在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);

總結(jié)

以上是生活随笔為你收集整理的在Cocos2d-x中使用CocosBuilder的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。