Cocos 2 d-x-Cocostudioリソースの導入

3358 ワード

(SegmentFaultのブログで自分を運ぶ)
現在、実訓のグループメンバーと一緒に携帯電話2 Dゲームを作っており、Cocos 2 d-xを採用して開発しています.以前は耳にしていましたが、今回初めてCocos 2 d-xを真剣に勉強して使いました.最初の数日はドキュメントを見たり、穴を登ったりしていました.その中の1つの穴はCocostudioという商品です.公式サイトのドキュメントは遅れていて詳細が足りないので、明らかにするために多くのブログを参考にして、サンプルコードも読みました.
本人のCocos 2 d-xのバージョンは3.1で、Cocostudioのバージョンは1.5です.Cocostudioの現在の機能には、UIエディタ、アニメーションエディタ、シーンエディタ、データエディタがあります.データエディタが触れていないので、言わないでください.残りの3つのうち、主にUIエディタをインポートするリソースについて説明します.UIエディタがエクスポートしたファイルには、.ExportJsonファイル、.plistファイル、.pngファイルが含まれます.Cocostudio中国語公式サイトではTouchGroup、英語公式サイトではUILayerと言っていますが、もう存在しません.UILayerLayerになり、Layerを作成せずにシーンに直接追加することもできます.コードは次のようになります.
Node *pNode = GUIReader::getInstance()->widgetFromJsonFile("test.ExportJson");
this->addChild(pNode);

次に、getChildByTagを使用してコンポーネントを取得できます.しかし、getChildByTagは木の構造に従って一つ一つしか撮れないようで、面倒で名前通りに取ることができません.したがって、uiHelperで直接ツリーからコンポーネントを取得し、nameまたはtagを使用することができるようになった.しかし、seekWidgetByTagおよびseekWidgetByNameの最初のパラメータはWidgetタイプであり、pNodeWidgetタイプに変換する必要がある.(.ExportJsonファイルから分かるように、pNodeはもともとWidgetタイプの木です)
Button *button = (Button*)(ui::Helper::seekWidgetByName(pNode, "button"));

ついでにイベントの傍受をバインドするコードを添付して、見た人が探す苦しみを免れるようにします.
button->addTouchEventListener(CC_CALLBACK_2(MainScene::touchEvent, this));
touchEventは自分で書く方法です.この方法は大体次のような使い方で、pSendertypeの使用に注意してください.
    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);

	}
}

アニメーションエディタに読み込まれたアニメーションのコードは次のとおりです.
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);

シーンエディタに読み込まれたシーンのコードは次のとおりです.
Node* pNode = SceneReader::getInstance()->createNodeWithSceneFile("scene.ExportJson");
this->addChild(pNode);

この読み出したNodeは、UIコンポーネントだけでなくアニメーションなどのリソースも含まれているため、Widgetに変換できないようです.コンポーネントの取得とバインドイベントのリスニングは、次のように書くことができます.
ComRender *render = (ComRender*)(pNode->getChildByTag(10010)->getComponent("GUIComponent"));
Widget *widget = (Widget*)(render->getNode());
widget->addTouchEventListener(CC_CALLBACK_2(MainScene::touchEvent, this));