[ゴミ箱][cocos2dx] 俺々/Fluxionでも紹介しようか

 たまには自分の作ったものの話とかしようかなって思いました。ということで、ゴミ箱の中から厳選された役に立つかもしれないし役に立たないかもしれない製作物についてちょっと書きます。今回はcocos2dx向け俺々ライブラリからアクション生成ユーティリティFluxionについてご紹介します!

俺々ライブラリとは

 俺々ライブラリは、俺がcocos2dxでゲームを作るときに役に立つかもしれない雑多な処理をまとめたライブラリです。cloneはこちらから。バグっても知りません。

Fluxion(cocos2dx Action Generator)

 Fluxionは、cocos2dxの面倒なアクション生成をサポートするテンプレートライブラリです。ちなみに名前の由来は「FLUently aCTION Generator」です(適当)。cocos2dx 3.0系で使えます(一部2.2.2でも動作しますがメンテされていません)。

簡単な紹介

 例えば、連続でアクションを実行したい場合、cocos2dxでは以下のように記述します。

runAction(
    Sequence::create(
        MoveTo::create(1.0f, Point(100, 100)),
        MoveTo::create(1.0f, Point::ZERO),
        NULL
    )
);

 長いですね、長いです。Variadic TemplateがあるC++11にもかかわらずNULLで終わってますしね…下位互換のために仕方ないことなのでしょうけど。それにcocos2dx特有のcreateもいちいち書かなきゃないので面倒です。さらに、リピートやら並列実行やらイージングやらを組み合わせようとするともっとカオスに…

runAction(
    Sequence::create(
        Spawn::create(
            MoveBy::create(0.3f, Point(300, 300)),
            FadeIn::create(0.3f),
            ScaleTo::create(0.3f, 1.0f),
            NULL
        ),
        Repeat::create(
            EaseBackOut::create(
                Sequence::create(
                    MoveTo::create(1.0f, Point::ZERO),
                    FadeOut::create(1.0f),
                    FadeIn::create(1.0f),
                    NULL
                )
            ),
            100
        ),
        NULL
    )
);

 こんな感じに!ちなみにコードに意味はありません。適当に書いたのでどんなアクションをするかわからないです。

 とにかく、長く長くなりがちです。そんな時はこのFluxion!演算子のオーバーロードを使って以下のように簡潔に記述できます。

runAction(
    x::moveTo(1.0f, 100, 100) >>
    x::moveTo(1.0f, Point::ZERO)
);

 なんと簡潔な!このように、2つのアクションを繋げたい場合は、>>演算子を使ってつなげます。2つ以上のアクションを繋げることも可能です。また、基本的なアクションはoreoreの「x」という名前空間に定義されていて、そのまま使用可能です。

 2つ目の例はこんな感じに書くことが出来ます。

runAction(
    (
        x::moveBy(0.3f, 300, 300) +
        x::fadeIn(0.3f) +
        x::scaleTo(0.3f, 1.0f)
    ) >>
    (
        x::moveTo(1.0f, Point::ZERO) >>
        x::fadeOut(1.0f) >>
        x::fadeIn(1.0f)
    ) * x::ease::backOut() * 100
);

 こんな感じになります。アクションを並列して実行したい場合は、+演算子を使用します。また、イージングやリピート等、アクションを修飾する場合は*演算子を利用します。

 ルールはこれだけ。生成されたFluxionオブジェクトは自動的にcocos2dxのアクションに変換されるため、runActionの引数としてそのまま使うことが出来ます。

さらに便利な関数呼び出し

 runActionで関数を呼び出すには、CallFuncを用いてラムダ関数やらファンクタやらをラップしてやる必要がありました。

runAction(
    Sequence::create(
        MoveTo::create(1.0f, Point(200, 200)),
        CallFunc::create([]() {
            log("move complete!");
        }),
        NULL
    )
);

 こんな感じですね。まぁメンバ関数ポインタを使わなきゃないcocos2dx 2系に比べればだいぶマシではありますが…

 なんと! Fluxionを使えばそのままラムダ関数を実行できちゃいます。

runAction(
    moveTo(1.0f, 200, 200) >> []() {
        log("move complete!");
    }
);

 これだけです。

cocos2dxのアクションとの連携も

 Fluxionのアクションシーケンスには、cocos2dxのアクションを追加することも出来ます。

runAction(
    x::moveTo(1.0f, 100, 100) >>
    MoveTo::create(1.0f, Point::ZERO)
);

 こんな感じでFluxionにないアクションを混ぜあわせることが出来ます。ただし、>>演算子や+演算子の両辺をcocos2dxのアクションにすることはできません。両辺のどちらかはFluxionのアクションである必要があります。

 両辺どっちもFluxionにないアクションだよー!というときは、x::fluxをつかってcocos2dxのアクションをFluxionのアクションに変換することが出来ます。

runAction(
    x::flux<TintTo>(1.0f, 0x66, 0x66, 0x66) >>
    TintTo::create(1.0f, 0xFF, 0xFF, 0xFF)
);

 こんな感じです。実に便利ですね!

まとめ

 いかがでしたか。Fluxionを使えば、面倒なアクションの生成が手軽に行えるようになります。実際にはアクションを手書きする、というシチュエーションはあまりないのかもしれませんが…

 Fluxionは俺々ライブラリの一部ですが、cocos2d.h以外に依存しないので単体でも使用可能です。

 Fluxionの詳しい話はこちらからドキュメントを参照してください。

Fluxion単体での利用はこちら

0 件のコメント :

コメントを投稿