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エディタがエクスポートしたファイルには、
次に、
ついでにイベントの傍受をバインドするコードを添付して、見た人が探す苦しみを免れるようにします.
アニメーションエディタに読み込まれたアニメーションのコードは次のとおりです.
シーンエディタに読み込まれたシーンのコードは次のとおりです.
この読み出した
現在、実訓のグループメンバーと一緒に携帯電話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
と言っていますが、もう存在しません.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
の使用に注意してください. 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));