CocosBuilder 教程
轉(zhuǎn)自泰然網(wǎng),原文地址:http://www.tairan.com/archives/2614,感謝作者分享。
CocosBuilder是Cocos2d系列的配套開源工具,最新的版本是3.0a, 也是我們這個文章所采用的版本.CocosBuilder目前只有OS X版本, 沒有Windows的版本, 而且開發(fā)語言是Objective-c, 估計(jì)移植難度會比較大. 我想這個也是其不夠流行的原因吧.
如果你是CocosBuilder的熟客,那么你一定會記得CocosBuilder v2.x以前版本附帶的例子(以下我們提到例子即為這個例子).[http://cocosbuilder.com/?page_id=11] 而CocosBuilder v3.0采用了一個叫做CocosDragonJS的例子, 主要是展示CocosBuilder 的Javascript的調(diào)用能力.我雖然很喜歡JS, 但是正在學(xué)習(xí)2d-x, 又很想學(xué)好, 所以還是打好基礎(chǔ), 學(xué)好原滋原味的2d-x才好, 以后換用無論是Html5, 還是JS, Lua, 心里才會覺得踏實(shí).我無論C++,還是2d-x都是新手,又是第一次想正兒八經(jīng)的寫文章, 難免有很多錯誤, 還望各位看客踴躍拍磚.
對CocosBuilder不熟悉的朋友, 可以先去CocosBuilder網(wǎng)站看下其例子, 或者運(yùn)行下cocos2d-x源代碼目錄下sample/TestCpp項(xiàng)目, 可以在ExtensionsTest里面找到CocosBuilderTest這個例子.
這次的目的是基本實(shí)現(xiàn)原來v2.0中的例子. 我采用的2d-x的版本是:cocos2d-2.1beta3-x-2.1.0, 以O(shè)S X版本為主, 以sample目錄下的HelloCpp為基礎(chǔ)改進(jìn). CocosBuilder 的版本是v3.0alpha0.
(一)
萬事開頭難,我們先來建立基本的開發(fā)環(huán)境, 保證最基本的運(yùn)行.
我們需要一份cocos2d-2.1beta3-x-2.1.0的源代碼, 并將其sample/HelloCpp目錄重命名為sample/CocosBuilderTest. 打開CocosBuilder, 在sample/CocosBuilderTest/ccb-source/目錄中創(chuàng)建一個新的CocosBuilder項(xiàng)目. 將CocosBuilder官方例子中的圖片等資源文件復(fù)制到該目錄. 我們對該目錄下的文件結(jié)構(gòu)做了一些調(diào)整, 以便于使用. 具體可以參見我打包后的整體項(xiàng)目文件.
我們可以在CocosBuilder菜單中找到Project/Publish Settings, 應(yīng)該被設(shè)置成如圖的樣子.
這時我們可以Publish下項(xiàng)目, CocosBuilder會將ccb文件輸出成二進(jìn)制的ccbi文件,ccbi文件是我們在Xcode項(xiàng)目中使用的格式.
然后我們使用Xcode打開samples/CocosBuilderTest/proj.mac/HelloCpp.xcodeproj , 我們首先要將資源文件納入項(xiàng)目. 然后再將cocos2d-x源碼中的extensions目錄也加入到項(xiàng)目中來, 其中負(fù)責(zé)ccbi文件解析的模塊CCBReader即包含在該目錄中.但并不是該目錄所有文件都需要引入, 參見下圖或者代碼包.
1.添加一個新類MainScene如下
MainScene.h
MainScene.cpp
#include "MainScene.h"USING_NS_CC; USING_NS_CC_EXT;CCScene* MainScene::scene() {CCScene *scene = CCScene::create();CCNodeLoaderLibrary *lib = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary(); //生成一個默認(rèn)的Node LoaderCCBReader *reader = new CCBReader(lib); //用node load lib 初始化一個ccb readerCCNode *node = reader->readNodeGraphFromFile("MainScene.ccbi", scene); //從ccbi文件中加載nodereader->release(); //注意手動釋放內(nèi)存if (node!=NULL){scene->addChild(node); //將node 添加到scene中}return scene; }2.修改AppDelegate.cpp中默認(rèn)的啟動scene
CCScene *pScene = MainScene::scene(); //HelloWorld::scene();3.注意CocosBuilder 中發(fā)布選項(xiàng)的設(shè)置, 并發(fā)布一次.
4.如果沒有錯誤的話, 你應(yīng)該可以看到運(yùn)行的效果.
需要說明的一點(diǎn)是CocosBuilder v3.0新增了一個自動縮放資源到匹配分辨率的功能. 我們這次沒有使用該功能.
(二)
這一小節(jié)我們主要實(shí)現(xiàn)CocosBuilder官方例子中HelloCocosBuilder這一例子.
1
在CocosBuilder 中打開MainScene.ccb,按delete鍵刪除已經(jīng)存在的幾個Sprite.
2
添加一個CCLayerGradient到屏幕, 如果有問題的話, 可以參見下CocosBuilder的幫助文檔. 選中該節(jié)點(diǎn), 我們可以在右側(cè)看到他的屬性, 常規(guī)的屬性有比如位置, 大小, 錨點(diǎn), 縮放, 旋轉(zhuǎn), 標(biāo)簽. 我們現(xiàn)在將其設(shè)置為大小為100%x100%的大小, 即滿屏.
3
從左側(cè)的文件列表中將burst.png拖入屏幕, 也可以使用工具欄添加然后再選擇屬性Sprite frame.
可以在節(jié)點(diǎn)樹上雙擊該節(jié)點(diǎn)給其重命名, 我們將該節(jié)點(diǎn)命名為CCSprite-burst, 便于識別.
同樣我們將其中心的設(shè)置到屏幕中心50%x50%, 縮放到2.5倍.
然后將Blend src, Blend dst 都設(shè)置為One, 好吧, 我暫時還不知道這個Blend是什么東西. 有知道的朋友不妨在評論中告訴我下, 或者參考資料.
大概是透明之類的東西吧.
4
然后我們再添加一個CCParticleSystemQuad粒子系統(tǒng), 就是工具欄的那個Fx按鈕.
將其位置設(shè)為最下居中, 在最下邊Particle Texture設(shè)置為ccbParticleSnow.png效果,粒子系統(tǒng)還是很復(fù)雜的,估計(jì)能單獨(dú)講很久了. 這里就不再展開了.
5
將logo-icon.png拖入屏幕, 放在左上角合適位置, 并將其縮放到0.5. 節(jié)點(diǎn)重命名為CCSprite-logo-icon.
接下來就是動畫的制作了.選中節(jié)點(diǎn), 可以在菜單欄中Animation => Insert KeyFrame找到插入Framekey的各種快捷鍵.或許我們需要記熟他們.
首先讓我們給Timeline設(shè)置下時間.雙擊時間可以編輯, 我們輸入00:03:00, 就是3秒鐘. 后面最后一位是幀數(shù), 每秒30幀.
按下小三角可以展開當(dāng)前節(jié)點(diǎn)的各種KeyFrame.
拖動時間軸游標(biāo)到1秒10幀,按下鍵盤S, 可以插入一個Scale類型的KeyFrame, 這時將當(dāng)前節(jié)點(diǎn)Scale屬性改為0.
然后繼續(xù)拖動時間軸游標(biāo)到2秒10幀, 再插入一個Scale KeyFrame, 并將Scale屬性改為0.5. 這時點(diǎn)擊播放按鈕, 可以看到logo會蹦出來.
然后在紫色條上點(diǎn)擊右鍵, 可以看到動作菜單, 我們選擇Bounce Out, 這個時候再點(diǎn)擊播放, 就可以看到logo蹦出的時候會有一個彈震的效果.
再來說明兩點(diǎn), 紫色條設(shè)置不同的動作, 可以看到上面會有一點(diǎn)陰影變化, 可以幫助我們快速確認(rèn)設(shè)置的是什么動作.
如果不小心加多了KeyFrame, 那么可以點(diǎn)擊選擇KeyFrame, 然后點(diǎn)擊delete鍵刪除.
還有需要注意的是, 如果游標(biāo)不在KeyFrame的點(diǎn)上, 那么此時無法編輯該節(jié)點(diǎn)屬性, 移動到相應(yīng)的KeyFrame點(diǎn)即可.
6
然后依法炮制, 將logo.png加入, 你可以給其設(shè)置想要的動畫效果.
7
我們再添加一個CCLabelBMFont, 字體設(shè)置為markerfelt24shadow.fnt.Label的內(nèi)容設(shè)置為”Hello Cocos2d-x!!!”, 然后調(diào)整下位置, 換個喜歡的顏色.
8
我們再添加一個CCControlButton, Title設(shè)置為Menu & Item.
然后再分別設(shè)置State Normal, State Highlighted的Sprite frame為btn-test-0.png btn-test-1.png.
然后再設(shè)置下彈出效果.
將這個節(jié)點(diǎn)再復(fù)制5份, 對齊. 再分別設(shè)置下Title和彈出效果.設(shè)置對齊的時候可能會比較麻煩. 可以從標(biāo)尺那里拉出幾條線, 可以用于對齊.按下cmd鍵,將該對齊線拉出顯示區(qū)域即可刪除.
9
最后將左右的兩片葉子加入屏幕, 設(shè)置個動畫即可. 然后將CocosBuilder 項(xiàng)目發(fā)布一下, 在Xcode里面將項(xiàng)目運(yùn)行一下. 就可以看到效果了.
10
我們接下來研究文件和類的綁定, 控件和變量的綁定, 以及事件和函數(shù)的綁定.
我們在CocosBuilder 中將根節(jié)點(diǎn)的Custom class設(shè)置為MainScene.
我們在Xcode中打開MainScene.h, 給MainScene增加一個新的函數(shù)CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(MainScene, create);.
最后的代碼應(yīng)該如下:
MainScene類
class MainScene : public cocos2d::CCLayer { public:static cocos2d::CCScene* scene();CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(MainScene, create); };然后在MainScene.h中添加一個新類MainSceneLayerLoader代碼如下:
class MainSceneLayerLoader : public cocos2d::extension::CCLayerLoader { public:CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(MainSceneLayerLoader, loader); protected:CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(MainScene); }; 如果需要探究的話, 可以點(diǎn)開相應(yīng)的函數(shù)定義. 也都是些簡單的工作.
吐槽下, 這些名字真的是太難記. 可能需要多熟悉下, 搞清楚其原理了才好.
然后我們在MainScene.cpp中添加一行注冊將ccb文件和類綁定起來.
CCNodeLoaderLibrary *lib = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary(); lib->registerCCNodeLoader("MainScene", MainSceneLayerLoader::loader()); 然后運(yùn)行下, 確保沒有錯誤.
這幾行代碼, 就是ccb文件和類綁定的最簡模式了.
11
接著我們研究下控件和變量的綁定.
我們先在CocosBuilder 中給CCLabelBMFont添加一個Doc root var類型的綁定mLabelText.
一個需要注意的地方就是CocosBuilder v3.0alpha似乎無法將jsControlled設(shè)置為false, 所以可能需要手工打開MainScene.ccb將其改為false.
MainScene.ccb
jsControlled然后在Xcode中給MainScene增加一個從CCBMemberVariableAssigner的繼承并實(shí)現(xiàn)其虛函數(shù). 并且添加相應(yīng)的變量.
class MainScene : public cocos2d::CCLayer , public cocos2d::extension::CCBMemberVariableAssigner { public:MainScene();~MainScene();static cocos2d::CCScene* scene();CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(MainScene, create);virtual bool onAssignCCBMemberVariable(cocos2d::CCObject* pTarget, const char* pMemberVariableName, cocos2d::CCNode* pNode);private:cocos2d::CCLabelBMFont *mLabelText; }; 在MainScene.cpp中需要添加的是:
MainScene.cpp
需要注意的是, 由于綁定較晚, 所以無法在init函數(shù)中使用變量mLabelText.
12
接下來我們研究事件和函數(shù)的綁定.
在CocosBuilder 中找到Menu & Item這個CCControlButton, 并設(shè)置其Selector為onButtonTest.Target設(shè)置為Document root.
這里需要注意的是, 設(shè)置值的時候,cocos2d-iphone似乎比較喜歡設(shè)置成onButtonTest:即多個:的形式. 我們在cocos2d-x中保持一致即可.不必加:.
然后打開MainScene.h給MainScene再增加一個繼承.
MainScene
class MainScene : public cocos2d::CCLayer , public cocos2d::extension::CCBMemberVariableAssigner , public cocos2d::extension::CCBSelectorResolver還有需要實(shí)現(xiàn)的函數(shù)
virtual cocos2d::SEL_MenuHandler onResolveCCBCCMenuItemSelector(cocos2d::CCObject * pTarget, const char* pSelectorName); virtual cocos2d::extension::SEL_CCControlHandler onResolveCCBCCControlSelector(cocos2d::CCObject * pTarget, const char* pSelectorName);void onButtonTest(cocos2d::CCObject *pSender, cocos2d::extension::CCControlEvent pCCControlEvent); 接下來是增加的函數(shù)的實(shí)現(xiàn)
MainScene.cpp
好了, 現(xiàn)在運(yùn)行一下, 點(diǎn)擊按鈕, 就會看到Hello Cocos2d-x!!!變成了Hello CocosBuilder!!!了.
13
剛才我們提到變量綁定較init函數(shù)(更別提運(yùn)行更早的構(gòu)造函數(shù)了)更晚. 那么如何運(yùn)行后就控制這些控件呢?
方法當(dāng)然是有, 我們需要增加一個CCNodeLoaderListener, 并實(shí)現(xiàn)其接口.新增代碼如下:
MainScene
MainScene.cpp
void MainScene::onNodeLoaded(cocos2d::CCNode *pNode, cocos2d::extension::CCNodeLoader *pNodeLoader) {this->mLabelText->setString("All Loaded"); } 好啦, 運(yùn)行就能看到All Loaded啦.
(三)
這一節(jié)要說的內(nèi)容比較輕松, 重要的知識點(diǎn)也不多.
目標(biāo)是實(shí)現(xiàn)Menus & Items, Sprites & 9 Slice, Buttons & Labels.
1
首先我們在CocosBuilder中建立一個新的Header.ccb.具體請參見CocosBuilder的項(xiàng)目.
在創(chuàng)建的時候,勾選Full Sceen, 并且將分辨率的Height都修改為40.
這個文件很簡單, 根節(jié)點(diǎn)下只包含一個CCLayerColor,根節(jié)點(diǎn)的Custom class設(shè)置為HeaderLayer.
CCLayerColor下面包含一個CCLabelTTF和CCMenu.
CCLabelTTF的變量綁定為類型Owner var, 值為mTitleLabelTTF.
CCMenu包含一個CCMenuItemImage. CCMenuItemImage的Selector屬性設(shè)置為onBackClicked.
這個ccb作為一個公用的元素被其他ccb文件所引用. 是屬于模塊化的一個例子.
然后我們在Xcode中新建一個HeaderLayer類, 并同時聲明一個HeaderLayerLoader類.
HeaderLayer.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(CCObject * pTarget, const char* pSelectorName);virtual cocos2d::extension::SEL_CCControlHandler onResolveCCBCCControlSelector(CCObject * pTarget, const char* pSelectorName);void onBackClicked(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); };HeaderLayer.cpp
SEL_MenuHandler HeaderLayer::onResolveCCBCCMenuItemSelector(cocos2d::CCObject *pTarget, const char *pSelectorName) {CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "onBackClicked", HeaderLayer::onBackClicked);return NULL; }SEL_CCControlHandler HeaderLayer::onResolveCCBCCControlSelector(cocos2d::CCObject *pTarget, const char *pSelectorName) {return NULL; }void HeaderLayer::onBackClicked(cocos2d::CCObject *pSender) {CCDirector::sharedDirector()->popScene(); } 2
在CocosBuilder中新建一個Menus.ccb, 并將根節(jié)點(diǎn)Custom class設(shè)置為MenuLayer.
再加入幾個CCMenuItemImage, Selector分別設(shè)置為onPressA, onPressB, onPressC.
再加入一個CCLabelBMFont, 綁定Doc root var, 值為mMessageLabelBMFont.
在Xcode中新建一個類MenuLayer, 并且在MenuLayer.h中同時聲明一個MenuLayerLoader類.
MenuLayer.h
class MenuLayer : public cocos2d::CCLayer , public cocos2d::extension::CCBMemberVariableAssigner , public cocos2d::extension::CCBSelectorResolver { public:MenuLayer();~MenuLayer();CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(MenuLayer, create);virtual bool onAssignCCBMemberVariable(CCObject* pTarget, const char* pMemberVariableName, CCNode* pNode);virtual cocos2d::SEL_MenuHandler onResolveCCBCCMenuItemSelector(CCObject * pTarget, const char* pSelectorName);virtual cocos2d::extension::SEL_CCControlHandler onResolveCCBCCControlSelector(CCObject * pTarget, const char* pSelectorName);void onPressA(cocos2d::CCObject *pSender);void onPressB(cocos2d::CCObject *pSender);void onPressC(cocos2d::CCObject *pSender);private:cocos2d::CCLabelBMFont *mMessageLabelBMFont; };class MenuLayerLoader : public cocos2d::extension::CCNodeLoaderLibrary { public:CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(MenuLayerLoader, loader); protected:CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(MenuLayer); };MenuLayer.cpp
MenuLayer::MenuLayer() : mMessageLabelBMFont(NULL) {}MenuLayer::~MenuLayer() {CC_SAFE_DELETE(mMessageLabelBMFont); }bool MenuLayer::onAssignCCBMemberVariable(cocos2d::CCObject *pTarget, const char *pMemberVariableName, cocos2d::CCNode *pNode) {CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "mMessageLabelBMFont", CCLabelBMFont*, this->mMessageLabelBMFont);return false; }SEL_MenuHandler MenuLayer::onResolveCCBCCMenuItemSelector(cocos2d::CCObject *pTarget, const char *pSelectorName) {CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "onPressA", MenuLayer::onPressA);CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "onPressB", MenuLayer::onPressB);CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "onPressC_NO_Match", MenuLayer::onPressC);//注意這里, 我們給第三個綁定了一個不存在的SelectorName.return NULL; }SEL_CCControlHandler MenuLayer::onResolveCCBCCControlSelector(cocos2d::CCObject *pTarget, const char *pSelectorName) {return NULL; }void MenuLayer::onPressA(cocos2d::CCObject *pSender) {this->mMessageLabelBMFont->setString("A pressed."); }void MenuLayer::onPressB(cocos2d::CCObject *pSender) {this->mMessageLabelBMFont->setString("B pressed."); }void MenuLayer::onPressC(cocos2d::CCObject *pSender) {this->mMessageLabelBMFont->setString("C pressed."); } 3
或許有點(diǎn)著急了吧, 我們?nèi)绾巫屵@個運(yùn)行起來呢?
首先給MainScene增加一個新函數(shù)的聲明及定義, 還需要增加一個變量用于和Header.ccb中的mTitleLabelTTF綁定.
MainScene.h
public:void openTest(const char * pCCBFileName, const char * pCCNodeName = NULL, cocos2d::extension::CCNodeLoader * pCCNodeLoader = NULL); private:cocos2d::CCLabelTTF *mTitleLabelTTF;MainScene.cpp
void MainScene::openTest(const char * pCCBFileName, const char * pCCNodeName, cocos2d::extension::CCNodeLoader * pCCNodeLoader) {CCScene *scene = CCScene::create();CCNodeLoaderLibrary *lib = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();lib->registerCCNodeLoader("HeaderLayer", HeaderLayerLoader::loader());lib->registerCCNodeLoader(pCCNodeName, pCCNodeLoader);CCBReader *reader = new CCBReader(lib);CCNode *node = reader->readNodeGraphFromFile(pCCBFileName, this);reader->autorelease();if (node != NULL){scene->addChild(node);}this->mTitleLabelTTF->setString(pCCBFileName);CCDirector::sharedDirector()->pushScene(scene); }bool MainScene::onAssignCCBMemberVariable(cocos2d::CCObject *pTarget, const char *pMemberVariableName, cocos2d::CCNode *pNode) {CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "mLabelText", CCLabelBMFont*, this->mLabelText);CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "mTitleLabelTTF", CCLabelTTF*, this->mTitleLabelTTF);return false; } void MainScene::onButtonTest(cocos2d::CCObject *pSender, cocos2d::extension::CCControlEvent pCCControlEvent) {this->openTest("ccb/Menus.ccbi", "MenuLayer", MenuLayerLoader::loader()); } 運(yùn)行一下吧, 看看效果.
4
Sprites & 9 Slice 這個比較簡單, 只是靠CocosBuilder就能完成任務(wù)了.我這里就不在贅述了.
我拼的不太好, 嘿嘿. 主要是著重代碼, 并非設(shè)計(jì), 漂亮的事情交給美術(shù)妹紙吧.
5
Buttons這塊主要是研究了CCControlEvent的各種情況. 我們只貼出核心代碼.
ButtonsLayer.cpp
void ButtonsLayer::onBtnClicked(cocos2d::CCObject *pSender, cocos2d::extension::CCControlEvent pCCControlEvent) {switch (pCCControlEvent) {case CCControlEventTouchCancel:this->mEventLabelBMFont->setString("Cancel");break;case CCControlEventTouchDown:this->mEventLabelBMFont->setString("Touch Down");break;case CCControlEventTouchDragEnter:this->mEventLabelBMFont->setString("Drag Enter");break;case CCControlEventTouchDragExit:this->mEventLabelBMFont->setString("Drag Exit");break;case CCControlEventTouchDragInside:this->mEventLabelBMFont->setString("Drag Inside");break;case CCControlEventTouchDragOutside:this->mEventLabelBMFont->setString("Drag OutSide");break;case CCControlEventTouchUpInside:this->mEventLabelBMFont->setString("Up Inside");break;case CCControlEventTouchUpOutside:this->mEventLabelBMFont->setString("Up Outside");break;default://所有的定義都在上面了,TestCPP里面有句經(jīng)典的點(diǎn)評, 想看的可以去翻一下.break;} }
(四)
這一節(jié)也是很輕松, 主要是牽涉到Timeline的切換. 其他的都是簡單的界面制作.
所以CocosBuilder的威力也體現(xiàn)在這里, 很少的代碼就能驅(qū)動界面了.
我們這次先做Particle System, Scroll View, 最后以Animations收官.
1
制作Particle System和Scroll View的界面很簡單,我們也是以程序?yàn)橹攸c(diǎn), 所以不再贅述.
只需要一句this->openTest(“ccb/Scroll.ccbi”);就可以調(diào)用新的界面了.
其他諸如綁定之類相信大家已經(jīng)是輕車熟路啦.
2
好吧, 我承認(rèn)一點(diǎn), 制作Animations的界面的時候, 我直接復(fù)制了例子中的節(jié)點(diǎn).
5個Timeline, 還是很復(fù)雜的, 應(yīng)該是一個非常精細(xì)的工作. 向美術(shù)們致敬.
AnimationsLayer.h
class AnimationsLayer : public cocos2d::CCLayer , public cocos2d::extension::CCBSelectorResolver { public:AnimationsLayer();~AnimationsLayer();CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(AnimationsLayer, create);virtual cocos2d::SEL_MenuHandler onResolveCCBCCMenuItemSelector(CCObject * pTarget, const char* pSelectorName);virtual cocos2d::extension::SEL_CCControlHandler onResolveCCBCCControlSelector(CCObject * pTarget, const char* pSelectorName);void setAnimationManager(cocos2d::extension::CCBAnimationManager *pAnimationManager);void onIdle(cocos2d::CCObject * pSender, cocos2d::extension::CCControlEvent pCCControlEvent);void onWave(cocos2d::CCObject * pSender, cocos2d::extension::CCControlEvent pCCControlEvent);void onJump(cocos2d::CCObject * pSender, cocos2d::extension::CCControlEvent pCCControlEvent);void onFunky(cocos2d::CCObject * pSender, cocos2d::extension::CCControlEvent pCCControlEvent); private:cocos2d::extension::CCBAnimationManager *mAnimationManager; };class AnimationsLayerLoader : public cocos2d::extension::CCNodeLoader { public:CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(AnimationsLayerLoader, loader); protected:CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(AnimationsLayer); };AnimationsLayer.cpp
AnimationsLayer::AnimationsLayer() : mAnimationManager(NULL) {}AnimationsLayer::~AnimationsLayer() {CC_SAFE_RELEASE_NULL(mAnimationManager); }SEL_MenuHandler AnimationsLayer::onResolveCCBCCMenuItemSelector(cocos2d::CCObject *pTarget, const char *pSelectorName) {return NULL; }SEL_CCControlHandler AnimationsLayer::onResolveCCBCCControlSelector(cocos2d::CCObject *pTarget, const char *pSelectorName) {CCB_SELECTORRESOLVER_CCCONTROL_GLUE(this, "onIdle", AnimationsLayer::onIdle);CCB_SELECTORRESOLVER_CCCONTROL_GLUE(this, "onJump", AnimationsLayer::onJump);CCB_SELECTORRESOLVER_CCCONTROL_GLUE(this, "onWave", AnimationsLayer::onWave);CCB_SELECTORRESOLVER_CCCONTROL_GLUE(this, "onFunky", AnimationsLayer::onFunky);return NULL; }void AnimationsLayer::setAnimationManager(cocos2d::extension::CCBAnimationManager *pAnimationManager) {CC_SAFE_RELEASE_NULL(mAnimationManager);mAnimationManager = pAnimationManager;CC_SAFE_RETAIN(mAnimationManager); }void AnimationsLayer::onIdle(cocos2d::CCObject *pSender, cocos2d::extension::CCControlEvent pCCControlEvent) {this->mAnimationManager->runAnimationsForSequenceNamedTweenDuration("Idle", 0.3f); }void AnimationsLayer::onJump(cocos2d::CCObject *pSender, cocos2d::extension::CCControlEvent pCCControlEvent) {this->mAnimationManager->runAnimationsForSequenceNamedTweenDuration("Jump", 0.3f); }void AnimationsLayer::onWave(cocos2d::CCObject *pSender, cocos2d::extension::CCControlEvent pCCControlEvent) {this->mAnimationManager->runAnimationsForSequenceNamedTweenDuration("Wave", 0.3f); }void AnimationsLayer::onFunky(cocos2d::CCObject *pSender, cocos2d::extension::CCControlEvent pCCControlEvent) {this->mAnimationManager->runAnimationsForSequenceNamedTweenDuration("Funky", 0.3f); } 整個代碼還是很簡單. 和以前的幾個例子稍微有點(diǎn)不同的是在調(diào)用的時候, 需要把CCBReader里面的AnimationManger傳入.
好, 還是看下調(diào)用的代碼吧.
MainScene.cpp
void MainScene::onAnimations(cocos2d::CCObject *pSender, cocos2d::extension::CCControlEvent pCCControlEvent) {const char * pCCBFileName = "ccb/Animations.ccbi";const char * pCCNodeName = "AnimationsLayer";cocos2d::extension::CCNodeLoader * pCCNodeLoader = AnimationsLayerLoader::loader();CCScene *scene = CCScene::create();CCNodeLoaderLibrary *lib = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();lib->registerCCNodeLoader("HeaderLayer", HeaderLayerLoader::loader());if (pCCNodeName!=NULL && pCCNodeLoader!=NULL){lib->registerCCNodeLoader(pCCNodeName, pCCNodeLoader);}CCBReader *reader = new CCBReader(lib);CCNode *node = reader->readNodeGraphFromFile(pCCBFileName, this);reader->autorelease();if (node != NULL){//獲取AnimationManger 并傳給AnimationsLayer((AnimationsLayer*)node) ->setAnimationManager(reader->getAnimationManager());scene->addChild(node);}this->mTitleLabelTTF->setString(pCCBFileName);CCDirector::sharedDirector()->pushScene(scene); }
總結(jié)
以上是生活随笔為你收集整理的CocosBuilder 教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 键盘输入管理
- 下一篇: WAP网站制作