目前正在和實訓的小組成員一塊兒作一款手機2D遊戲,咱們採用了Cocos2d-x進行開發。以前雖然早有耳聞,此次倒是第一次認真地學習和使用Cocos2d-x。最開始的幾天就是在不停的看文檔和爬坑。其中一個坑就是Cocostudio這貨。官網的文檔滯後並且不夠詳細,爲了弄清楚,借鑑了不少博客,也閱讀了示例代碼。
本人Cocos2d-x的版本是3.1,Cocostudio的版本是1.5.
Cocostudio目前的功能包括UI編輯器、動畫編輯器、場景編輯器和數據編輯器。數據編輯器沒有涉及到,就不說了。剩下三者中主要講下導入UI編輯器的資源。
UI編輯器導出的文件包括一個.ExportJson
文件,一個.plist
文件和一個.png
文件。Cocostudio中文官網中說的是TouchGroup
,英文官網中是UILayer
,但是都已經不存在了。UILayer
變成了Layer
,如今也能夠不建立Layer
,直接加到場景上面。因此代碼能夠這樣:編輯器
Node *pNode = GUIReader::getInstance()->widgetFromJsonFile("test.ExportJson"); this->addChild(pNode);
下面就能夠用getChildByTag
來獲取組件了。不過getChildByTag
貌似只能按照樹的結構一層層照下來,顯得很麻煩,並且不能按照名字來取。因此,如今能夠用ui
中的Helper
直接從樹中獲取組件,用name或者tag。但seekWidgetByTag
和seekWidgetByName
的第一個參數是Widget類型,須要將pNode
轉成Widget
類型。(從.ExportJson
文件能夠看出來,pNode
原本就是一個Widget
類型的樹)學習
Button *button = (Button*)(ui::Helper::seekWidgetByName(pNode, "button"));
順便附上綁定事件監聽的代碼,使看到的人免去尋找之苦。動畫
button->addTouchEventListener(CC_CALLBACK_2(MainScene::touchEvent, this));
touchEvent
是本身寫的方法。這個方法大體是以下用法,注意pSender
和type
的使用。ui
void SingleMenuScene::selectEvent(Ref *pSender, Widget::TouchEventType type) { switch(type) { case Widget::TouchEventType::ENDED: GameSetting::Map map = GameSetting::Map::DEFAULT; if(pSender == defaultBtn) { map = GameSetting::Map::DEFAULT; } else if(pSender == snowBtn) { map = GameSetting::Map::SNOW; } Scene *game = BattleScene::createScene(map); TransitionScene *transition = TransitionFade::create(0.5, game); Director::getInstance()->replaceScene(transition); } }
導入動畫編輯器的動畫的代碼以下:this
CCArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("Animation0.png","Animation0.plist","Animation.ExportJson"); CCArmature *armature = CCArmature::create("Animation"); armature->getAnimation()->playByIndex(0); armature->setScale(0.5f); armature->setPosition(ccp(visibleSize.width * 0.5, visibleSize.height * 0.5)); this->addChild(armature);
導入場景編輯器的場景的代碼以下:code
Node* pNode = SceneReader::getInstance()->createNodeWithSceneFile("scene.ExportJson"); this->addChild(pNode);
這個讀出的Node
貌似不能轉成Widget
,由於它不只包括UI組件還有動畫等資源。獲取組件和綁定事件監聽能夠這樣寫:遊戲
ComRender *render = (ComRender*)(pNode->getChildByTag(10010)->getComponent("GUIComponent")); Widget *widget = (Widget*)(render->getNode()); widget->addTouchEventListener(CC_CALLBACK_2(MainScene::touchEvent, this));