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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CocosBuilder 教程

發布時間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CocosBuilder 教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自泰然網,原文地址:http://www.tairan.com/archives/2614,感謝作者分享。

CocosBuilder是Cocos2d系列的配套開源工具,最新的版本是3.0a, 也是我們這個文章所采用的版本.CocosBuilder目前只有OS X版本, 沒有Windows的版本, 而且開發語言是Objective-c, 估計移植難度會比較大. 我想這個也是其不夠流行的原因吧.

如果你是CocosBuilder的熟客,那么你一定會記得CocosBuilder v2.x以前版本附帶的例子(以下我們提到例子即為這個例子).[http://cocosbuilder.com/?page_id=11] 而CocosBuilder v3.0采用了一個叫做CocosDragonJS的例子, 主要是展示CocosBuilder 的Javascript的調用能力.我雖然很喜歡JS, 但是正在學習2d-x, 又很想學好, 所以還是打好基礎, 學好原滋原味的2d-x才好, 以后換用無論是Html5, 還是JS, Lua, 心里才會覺得踏實.我無論C++,還是2d-x都是新手,又是第一次想正兒八經的寫文章, 難免有很多錯誤, 還望各位看客踴躍拍磚.

對CocosBuilder不熟悉的朋友, 可以先去CocosBuilder網站看下其例子, 或者運行下cocos2d-x源代碼目錄下sample/TestCpp項目, 可以在ExtensionsTest里面找到CocosBuilderTest這個例子.

這次的目的是基本實現原來v2.0中的例子. 我采用的2d-x的版本是:cocos2d-2.1beta3-x-2.1.0, 以OS X版本為主, 以sample目錄下的HelloCpp為基礎改進. CocosBuilder 的版本是v3.0alpha0.

(一)
萬事開頭難,我們先來建立基本的開發環境, 保證最基本的運行.

我們需要一份cocos2d-2.1beta3-x-2.1.0的源代碼, 并將其sample/HelloCpp目錄重命名為sample/CocosBuilderTest. 打開CocosBuilder, 在sample/CocosBuilderTest/ccb-source/目錄中創建一個新的CocosBuilder項目. 將CocosBuilder官方例子中的圖片等資源文件復制到該目錄. 我們對該目錄下的文件結構做了一些調整, 以便于使用. 具體可以參見我打包后的整體項目文件.


我們可以在CocosBuilder菜單中找到Project/Publish Settings, 應該被設置成如圖的樣子.

這時我們可以Publish下項目, CocosBuilder會將ccb文件輸出成二進制的ccbi文件,ccbi文件是我們在Xcode項目中使用的格式.

然后我們使用Xcode打開samples/CocosBuilderTest/proj.mac/HelloCpp.xcodeproj , 我們首先要將資源文件納入項目. 然后再將cocos2d-x源碼中的extensions目錄也加入到項目中來, 其中負責ccbi文件解析的模塊CCBReader即包含在該目錄中.但并不是該目錄所有文件都需要引入, 參見下圖或者代碼包.

1.添加一個新類MainScene如下
MainScene.h

#ifndef __HelloCpp__MainScene__ #define __HelloCpp__MainScene__#include "cocos2d.h" #include "cocos-ext.h"class MainScene : public cocos2d::CCLayer //從CCLayer派生 { public:static cocos2d::CCScene* scene(); };#endif /* defined(__HelloCpp__MainScene__) */

MainScene.cpp

#include "MainScene.h"USING_NS_CC; USING_NS_CC_EXT;CCScene* MainScene::scene() {CCScene *scene = CCScene::create();CCNodeLoaderLibrary *lib = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary(); //生成一個默認的Node LoaderCCBReader *reader = new CCBReader(lib); //用node load lib 初始化一個ccb readerCCNode *node = reader->readNodeGraphFromFile("MainScene.ccbi", scene); //從ccbi文件中加載nodereader->release(); //注意手動釋放內存if (node!=NULL){scene->addChild(node); //將node 添加到scene中}return scene; }

2.修改AppDelegate.cpp中默認的啟動scene

CCScene *pScene = MainScene::scene(); //HelloWorld::scene();

3.注意CocosBuilder 中發布選項的設置, 并發布一次.

4.如果沒有錯誤的話, 你應該可以看到運行的效果.

需要說明的一點是CocosBuilder v3.0新增了一個自動縮放資源到匹配分辨率的功能. 我們這次沒有使用該功能.

(二)
這一小節我們主要實現CocosBuilder官方例子中HelloCocosBuilder這一例子.

1
在CocosBuilder 中打開MainScene.ccb,按delete鍵刪除已經存在的幾個Sprite.

2
添加一個CCLayerGradient到屏幕, 如果有問題的話, 可以參見下CocosBuilder的幫助文檔. 選中該節點, 我們可以在右側看到他的屬性, 常規的屬性有比如位置, 大小, 錨點, 縮放, 旋轉, 標簽. 我們現在將其設置為大小為100%x100%的大小, 即滿屏.

3
從左側的文件列表中將burst.png拖入屏幕, 也可以使用工具欄添加然后再選擇屬性Sprite frame.
可以在節點樹上雙擊該節點給其重命名, 我們將該節點命名為CCSprite-burst, 便于識別.
同樣我們將其中心的設置到屏幕中心50%x50%, 縮放到2.5倍.
然后將Blend src, Blend dst 都設置為One, 好吧, 我暫時還不知道這個Blend是什么東西. 有知道的朋友不妨在評論中告訴我下, 或者參考資料.
大概是透明之類的東西吧.

4
然后我們再添加一個CCParticleSystemQuad粒子系統, 就是工具欄的那個Fx按鈕.
將其位置設為最下居中, 在最下邊Particle Texture設置為ccbParticleSnow.png效果,粒子系統還是很復雜的,估計能單獨講很久了. 這里就不再展開了.

5
將logo-icon.png拖入屏幕, 放在左上角合適位置, 并將其縮放到0.5. 節點重命名為CCSprite-logo-icon.
接下來就是動畫的制作了.選中節點, 可以在菜單欄中Animation => Insert KeyFrame找到插入Framekey的各種快捷鍵.或許我們需要記熟他們.
首先讓我們給Timeline設置下時間.雙擊時間可以編輯, 我們輸入00:03:00, 就是3秒鐘. 后面最后一位是幀數, 每秒30幀.
按下小三角可以展開當前節點的各種KeyFrame.
拖動時間軸游標到1秒10幀,按下鍵盤S, 可以插入一個Scale類型的KeyFrame, 這時將當前節點Scale屬性改為0.
然后繼續拖動時間軸游標到2秒10幀, 再插入一個Scale KeyFrame, 并將Scale屬性改為0.5. 這時點擊播放按鈕, 可以看到logo會蹦出來.
然后在紫色條上點擊右鍵, 可以看到動作菜單, 我們選擇Bounce Out, 這個時候再點擊播放, 就可以看到logo蹦出的時候會有一個彈震的效果.
再來說明兩點, 紫色條設置不同的動作, 可以看到上面會有一點陰影變化, 可以幫助我們快速確認設置的是什么動作.
如果不小心加多了KeyFrame, 那么可以點擊選擇KeyFrame, 然后點擊delete鍵刪除.
還有需要注意的是, 如果游標不在KeyFrame的點上, 那么此時無法編輯該節點屬性, 移動到相應的KeyFrame點即可.

6
然后依法炮制, 將logo.png加入, 你可以給其設置想要的動畫效果.

7
我們再添加一個CCLabelBMFont, 字體設置為markerfelt24shadow.fnt.Label的內容設置為”Hello Cocos2d-x!!!”, 然后調整下位置, 換個喜歡的顏色.

8
我們再添加一個CCControlButton, Title設置為Menu & Item.
然后再分別設置State Normal, State Highlighted的Sprite frame為btn-test-0.png btn-test-1.png.
然后再設置下彈出效果.
將這個節點再復制5份, 對齊. 再分別設置下Title和彈出效果.設置對齊的時候可能會比較麻煩. 可以從標尺那里拉出幾條線, 可以用于對齊.按下cmd鍵,將該對齊線拉出顯示區域即可刪除.

9
最后將左右的兩片葉子加入屏幕, 設置個動畫即可. 然后將CocosBuilder 項目發布一下, 在Xcode里面將項目運行一下. 就可以看到效果了.

10
我們接下來研究文件和類的綁定, 控件和變量的綁定, 以及事件和函數的綁定.
我們在CocosBuilder 中將根節點的Custom class設置為MainScene.
我們在Xcode中打開MainScene.h, 給MainScene增加一個新的函數CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(MainScene, create);.
最后的代碼應該如下:

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); };

如果需要探究的話, 可以點開相應的函數定義. 也都是些簡單的工作.
吐槽下, 這些名字真的是太難記. 可能需要多熟悉下, 搞清楚其原理了才好.

然后我們在MainScene.cpp中添加一行注冊將ccb文件和類綁定起來.

CCNodeLoaderLibrary *lib = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary(); lib->registerCCNodeLoader("MainScene", MainSceneLayerLoader::loader());

然后運行下, 確保沒有錯誤.
這幾行代碼, 就是ccb文件和類綁定的最簡模式了.

11
接著我們研究下控件和變量的綁定.
我們先在CocosBuilder 中給CCLabelBMFont添加一個Doc root var類型的綁定mLabelText.
一個需要注意的地方就是CocosBuilder v3.0alpha似乎無法將jsControlled設置為false, 所以可能需要手工打開MainScene.ccb將其改為false.

MainScene.ccb

jsControlled

然后在Xcode中給MainScene增加一個從CCBMemberVariableAssigner的繼承并實現其虛函數. 并且添加相應的變量.

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

MainScene::MainScene()//構造函數 : mLabelText(NULL) {}MainScene::~MainScene()//析構函數中釋放內存不能忘 {CC_SAFE_DELETE(mLabelText); }bool MainScene::onAssignCCBMemberVariable(cocos2d::CCObject *pTarget, const char *pMemberVariableName, cocos2d::CCNode *pNode) {CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "mLabelText", CCLabelBMFont*, this->mLabelText);return true; }

需要注意的是, 由于綁定較晚, 所以無法在init函數中使用變量mLabelText.

12
接下來我們研究事件和函數的綁定.
在CocosBuilder 中找到Menu & Item這個CCControlButton, 并設置其Selector為onButtonTest.Target設置為Document root.
這里需要注意的是, 設置值的時候,cocos2d-iphone似乎比較喜歡設置成onButtonTest:即多個:的形式. 我們在cocos2d-x中保持一致即可.不必加:.
然后打開MainScene.h給MainScene再增加一個繼承.

MainScene

class MainScene : public cocos2d::CCLayer , public cocos2d::extension::CCBMemberVariableAssigner , public cocos2d::extension::CCBSelectorResolver

還有需要實現的函數

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);

接下來是增加的函數的實現
MainScene.cpp

SEL_MenuHandler MainScene::onResolveCCBCCMenuItemSelector(cocos2d::CCObject *pTarget, const char *pSelectorName) {return NULL; }SEL_CCControlHandler MainScene::onResolveCCBCCControlSelector(cocos2d::CCObject *pTarget, const char *pSelectorName) {CCB_SELECTORRESOLVER_CCCONTROL_GLUE(this, "onButtonTest", MainScene::onButtonTest);return NULL; }void MainScene::onButtonTest(cocos2d::CCObject *pSender, cocos2d::extension::CCControlEvent pCCControlEvent) {this->mLabelText->setString("Hello CocosBuilder!!!"); }

好了, 現在運行一下, 點擊按鈕, 就會看到Hello Cocos2d-x!!!變成了Hello CocosBuilder!!!了.

13
剛才我們提到變量綁定較init函數(更別提運行更早的構造函數了)更晚. 那么如何運行后就控制這些控件呢?
方法當然是有, 我們需要增加一個CCNodeLoaderListener, 并實現其接口.新增代碼如下:
MainScene

, public cocos2d::extension::CCBSelectorResolver , public cocos2d::extension::CCNodeLoaderListener {///......代碼省略鳥virtual void onNodeLoaded(cocos2d::CCNode * pNode, cocos2d::extension::CCNodeLoader * pNodeLoader);///......代碼省略鳥 }

MainScene.cpp

void MainScene::onNodeLoaded(cocos2d::CCNode *pNode, cocos2d::extension::CCNodeLoader *pNodeLoader) {this->mLabelText->setString("All Loaded"); }

好啦, 運行就能看到All Loaded啦.

(三)
這一節要說的內容比較輕松, 重要的知識點也不多.
目標是實現Menus & Items, Sprites & 9 Slice, Buttons & Labels.

1
首先我們在CocosBuilder中建立一個新的Header.ccb.具體請參見CocosBuilder的項目.
在創建的時候,勾選Full Sceen, 并且將分辨率的Height都修改為40.
這個文件很簡單, 根節點下只包含一個CCLayerColor,根節點的Custom class設置為HeaderLayer.
CCLayerColor下面包含一個CCLabelTTF和CCMenu.
CCLabelTTF的變量綁定為類型Owner var, 值為mTitleLabelTTF.
CCMenu包含一個CCMenuItemImage. CCMenuItemImage的Selector屬性設置為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, 并將根節點Custom class設置為MenuLayer.
再加入幾個CCMenuItemImage, Selector分別設置為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
或許有點著急了吧, 我們如何讓這個運行起來呢?
首先給MainScene增加一個新函數的聲明及定義, 還需要增加一個變量用于和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()); }

運行一下吧, 看看效果.

4
Sprites & 9 Slice 這個比較簡單, 只是靠CocosBuilder就能完成任務了.我這里就不在贅述了.

我拼的不太好, 嘿嘿. 主要是著重代碼, 并非設計, 漂亮的事情交給美術妹紙吧.

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里面有句經典的點評, 想看的可以去翻一下.break;} }

(四)
這一節也是很輕松, 主要是牽涉到Timeline的切換. 其他的都是簡單的界面制作.
所以CocosBuilder的威力也體現在這里, 很少的代碼就能驅動界面了.

我們這次先做Particle System, Scroll View, 最后以Animations收官.

1
制作Particle System和Scroll View的界面很簡單,我們也是以程序為重點, 所以不再贅述.
只需要一句this->openTest(“ccb/Scroll.ccbi”);就可以調用新的界面了.
其他諸如綁定之類相信大家已經是輕車熟路啦.


2
好吧, 我承認一點, 制作Animations的界面的時候, 我直接復制了例子中的節點.
5個Timeline, 還是很復雜的, 應該是一個非常精細的工作. 向美術們致敬.

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); }

整個代碼還是很簡單. 和以前的幾個例子稍微有點不同的是在調用的時候, 需要把CCBReader里面的AnimationManger傳入.
好, 還是看下調用的代碼吧.

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); }

總結

以上是生活随笔為你收集整理的CocosBuilder 教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。