‘Squirrel’ タグのついている投稿

emo-frameworkを使ってみたので勘所

emo-frameworkが気になったので、勉強としてAndroidでゲームを一本作りました。

emo-framework – open source game engine for Android and iOS

使用したバージョンはemo-framework 0.2.0です。

盛りブロック
https://play.google.com/store/apps/details?id=info.play_smart.android.DishAndBlocks

device-2012-12-23-005339

ゼロから作り始めて3日ほどでリリースできました。
一番時間がかかったのはブロックのfixtureをひとつのbodyとして定義する部分です。

いくつか開発中に気になったところを書いてみます。

Squirrelはわかりやすい

emo-frameworkではSquirrelというスクリプト言語が使われています。
http://www.squirrel-lang.org/doc/squirrel3.html
いろんな言語のいいとこ取りをしたような言語です。
覚える必要もないくらい直感的に使えます。

サンプルが充実している

非常に助かります。とにかくサンプルとphysics.nutを何回も読むことになります。
box2dを使って物理演算するときはfixtureとphysicsInfoとSpriteとbodyの関係はよく把握しておく必要があります。

動作が速い

この程度のゲームなら動作速度に困ることはないようです。

onContactの引数で渡されるfixtureが何かを簡単に判定できない

衝突検知のコールバックであるonContactは衝突した2つのfixtureを引数に持ちますが、fixtureからSpriteを取り出す方法がないので何のSpriteなのかがわかりません。
bodyは取り出せるので、bodyのidを使って既存のSpriteに一致しているものがあるかどうかを調べることはできます。

    function onContact(state, fixtureA, fixtureB, 
            position, normal, normalImpulse, tangentImpulse) {
        if (state == PHYSICS_STATE_ADD) {
            // ID(userdata)から床と接触しているか判定する
            local fixtureId = floor.getPhysicsInfo().getFixture().id;
            if (fixtureA.id == fixtureId || fixtureB.id == fixtureId) {
                // ブロックのidを保持していた配列を全部回して判定する
                foreach (blockId in blockIds) {
                    if (blockId == fixtureA.id || blockId == fixtureB.id) {
                        doGameOver();
                        break;
                    }
                }
            }
        }
    }

もしかしたら他に方法があるのかもしれません。

Zインデックスは常に明示した方が良い

spriteのsetZ(num)でZインデックスを明示するようにしましょう。

あと、show()もセットで実行したほうがいいみたいです。Zオーダーがよくわからないことになるので。

        local score = emo.Sprite("score.png");
        score.move(11, 24);
        score.load();
        score.setZ(3);
        score.show();

1つのbodyに複数のfixtureを定義する場合は自力で書く

emo::Physics::createSpriteはSpriteと同じサイズの長方形Shapeを作成します。

なので、複雑な形状を作成したい場合は、emo::Physics::createDynamicSpriteなどを使わずにemo::Physics::createSpriteをコピーして自前で実装することになります。

body.createFixture(fixtureDef);を複数回実行すると、bodyに複数のfixtureを作成できます。

Android版では広告を同じ画面に入れられない

http://code.google.com/p/emo-framework/issues/detail?id=13

いわゆるView全般を入れられません。

iOS版ではiAdを入れられるようです。

http://www.emo-framework.com/AdvancedTips.html

広告を入れたければゲーム画面ではない、例えばランキング画面などに入れる方法を取る必要がありそうです。

EclipseならSQDEV入れましょう

http://wiki.squirrel-lang.org/default.aspx/SquirrelWiki/SQDEV.html

*.nutファイルのSyntax Highlightとかしてくれます。

ただ、構文エラー判定がおかしいのか、時々何も問題ない箇所でエラーを通知してきます。

エラーが通知されるとビルドできなくなってしまいますが、その行を一度カットしてペーストしなおせばエラーが消えます。

intent連携ができないらしい

どうやらintent連携ができないようです。

前述の問題で、ランキングページを別Activityで作ろうと思っていたのですが、飛べません。

多分ライブラリのJavaGlue.cppとかEmoActivity.javaあたりに手を入れれば実装できると思います。

もしくは、EmoActivity.javaを継承してonCreateOptionsMenuをオーバーライド、オプションメニューから画面遷移、という方法なら簡単に実装できます。

ただ、Twitterで共有などを実装したいとなると厄介です。OS個別の機能はあまり実装が進んでいないようです。

まとめ

box2d系で趣味的なアプリを作る分には開発コストもかなり低いので有効だと思います。

ただ、今年5月以降開発が進んでいないようなのと、開発者がひとりみたいなのでこのまま開発が止まってしまうような不安があります。オープンソースでNew BSDライセンスだから好きにやれという話だとは思いますが。