Cocos2d-x 3.x開發——導入Cocostudio資源

目前正在和實訓的小組成員一塊兒作一款手機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。但seekWidgetByTagseekWidgetByName的第一個參數是Widget類型,須要將pNode轉成Widget類型。(從.ExportJson文件能夠看出來,pNode原本就是一個Widget類型的樹)學習

Button *button = (Button*)(ui::Helper::seekWidgetByName(pNode, "button"));

順便附上綁定事件監聽的代碼,使看到的人免去尋找之苦。動畫

button->addTouchEventListener(CC_CALLBACK_2(MainScene::touchEvent, this));

touchEvent是本身寫的方法。這個方法大體是以下用法,注意pSendertype的使用。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));
相關文章
相關標籤/搜索