CocoStudioを使用した開発

木内智史之介(シャッチョー)
ミンカさんけっこんしてくださいおねがいします(ズザー
SEGAさん、DIVAの筐体ください(ズザー

お久しぶりです。智史之介です。 おかげさまで多忙の毎日を送っており、中々ブログを書けずにおりました。 言い訳ですね。いかんことです。

cocos2d-xに限らず、精力的にブログを書いていきますので、今後ともよろしくお願いいたします。

cocos2d-x 2015 advent calender

http://qiita.com/advent-calendar/2015/cocos2d-x

今年もこの時期がやってまいりました。advent calenderの話題が出てくると年の瀬を感じますね。 ふと気になって、cocos2d-xのカレンダーを確認してみると…。

全然参加者がいない!!

という状況で、若干の寂しさを感じつつ、諸手を挙げて参加している次第です。
打倒Unityですよ!みなさん!(目白)

CocoStudio もとい Cocos

ダウンロード

もともと「CocoStudio」という名前だったのですが、何を思ったのか「Cocos」に改名。
戦略としては、ただのUI構築ツールではなく、Cocosを中心に開発を行う、総合的なオーサリングツールを目指しているイメージでしょうか?

起ち上げてみると、こんな感じです。

  • Cocos Store
  • Downloads

など、期待してもよさそうなメニューが並んでいますね!
この調子で、打倒Unityに邁進してほしいものです。

カレンダーを見てみると、ちょこちょこCocoStudioに関する記事が上がりそうなので、 プロジェクトの作成などの細かい手順は他の方が書いてくれる事を期待して、 自分はプログラムとの連携部分に関して触れて行きたいと思います。

buttonオブジェクトとの連携

まずは基本中の基本。buttonオブジェクトを試してみましょう。 buttonを笑う者はbuttonに泣く…のか?

buttonオブジェクトの配置

buttonオブジェクトとは、

  • normal(通常)
  • pressed(押下時)
  • disabled(無効時)

の3つのステートをもったnodeです。

buttonオブジェクトに対する処理の追加

該当のbuttonインスタンスが押された際の処理の書き方はこんな感じです。

1
2
3
4
5
6
7
8
9
10
buttonShop = right->getChildByName<ui::Button*>("shopLink");
shopLayer = ShopLayer::create();
std::function<void(Ref*, ui::Widget::TouchEventType)> openShop = [this](Ref*, ui::Widget::TouchEventType type)
{
    if(type == ui::Widget::TouchEventType::ENDED)
    {
        shopLayer->open();
    }
};
buttonShop->addTouchEventListener(openShop);

うーん、いけてないw 他言語に慣れている人であれば、きっと、

1
2
3
buttonShop->addTouchEventListener("click", [=](Ref*){
    shopLayer->open();
});

てな感じに書きたいですよねー。Eventの種類の所、もうちょっとフレームワーク側で巻き取ってほしいですよねー。
こう思うのは僕だけじゃないはず!

nodeのタイムラインとの同期処理

つづいて、nodeのタイムラインに関する処理の書き方をみてみましょう。

animationの追加

まずは、タイムライン(frame)にアニメーションの追加。

animationの再生

指定したanimationを再生します。

1
2
csAction = ActionTimelineCache::getInstance()->createAction("result/result.csb");
csAction->play("resultStart", false);

animationとの同期処理

指定のアニメーションの再生が終了したら、っていう書き方はこんな感じ。

1
2
3
4
5
csAction = ActionTimelineCache::getInstance()->createAction("result/result.csb");
csAction->play("resultStart", false);
csAction->setLastFrameCallFunc([=](){
    // resultStartアニメーションが終了したときの処理
});

「終了時」に限定しない処理を書きたい場合はこんな感じです。

1
2
3
4
5
6
7
8
9
10
11
12
13
csAction = ActionTimelineCache::getInstance()->createAction("result/result.csb");

// register callback
csAction->setFrameEventCallFunc([=](Frame *frame){
    EventFrame *eFrame = dynamic_cast<EventFrame *>(frame);
    std::string str = eFrame->getEvent();

    if (str == "hogehoge") {
        // hogehoge時の処理
    }
});

csAction->play("resultStart", false);

プレビュー機能

Unityさながら!とまでは言いませんが、Cocosでもプレビュー機能が搭載されています。
簡単なアニメーションならプレビュー機能が便利です!

まとめ

まだまだ発展途上な感じが否めませんが、Cocos、いかがでしたでしょうか? cocos2d-xは、3Dなんかに浮気せずに、2Dを突っ走ってれば、もっとこういうオーサリングツールの開発にリソースを割けたと思うんですよねー。

変にUnityにかぶれてしまって、方向性を見失って欲しくないものです。

ぶっちゃけ、Unityに張り合っちゃいけないんです、キミは。

Unityとは違うマスを取りに行きなさい。そうでないと、生き残れないと思いますよ!