Box2Dを使ってゲーム作成 - その1

Box2Dを使ってゲーム作成 その1です。
Box2Dの勉強も兼ねて、ということで、さぐりさぐりやっていきたいと思っています。

以下のサイトを参考にしています。

Box2Dをゲームに使う際の注意点 - Master of None
http://d.hatena.ne.jp/o_healer/20080506/1210048634
Box2DFlashAS3 の単純なサンプルと使い方 (2.0.2版) - てっく煮ブログ
http://d.hatena.ne.jp/nitoyon/20090428/box2dflashas3_2_0_2
parpue.net - Box2D で 降りしきる音符を拾いまわる箱
http://parpue.net/web/38

今のところの進行状況は以下のような感じ。あんまり進んでいません。
ちなみに画面の端っこにブロックが置いてありますが、ちょっとさびしかったので置いてみただけです。作成予定のゲームには全く不要なものですw

なお、マリオとブロックの画像は以下のサイトからお借りしています。

Dotluigi(ドットルイージ)
http://www15.ocn.ne.jp/~kawase/

作っていて気付いたことのメモです。

Box2Dで箱を作って、その箱の位置にマリオの画像を描画するということをやっているのですが、そのまま使っていると、当然傾きなんかもちゃんと計算されてしまうので、箱がすぐに倒れてしまうのです。
その点は、parpue.net さんのコードを参考に対処しました。

var xform:b2XForm = square.GetXForm(); 
square.SetXForm(xform.position, 0); 

次に床との当たり判定なんですが、「床となる物体には絶対に上からしか乗らない」という仕様ならば簡単にできることがわかりました。

if( !onGround ){
    for (var iter:b2Contact = marioObject.m_world.m_contactList; iter != null; iter = iter.GetNext()) {   
        var obj:Object = iter.m_shape1.GetBody().m_userData as Object;
        var mario:Mario = iter.m_shape2.GetBody().m_userData as Mario;
        if ( obj &&  mario ) {
            onGround = (obj.name == "floor");
            break;
        }
    }
}

(このコードはわかりやすいように改編しています、本来なら参考サイトさんのように同一のクラスを継承して、お互いのコリジョン関数を呼び出す方法がいいと思います。)
上のように、マリオクラスのインスタンスを持たせたオブジェクトと、床のオブジェクト(nameにfloorいう文字列をセットしておいて判定)と当たっているならば床の上に立っている、と判定することが出来ます。

ただ、この方法だと、床の下に入れるようなマップでは使えません。マリオがジャンプして頭が床に当たった時にも、地面に立っていると判定されてしまうからです。

今回の作成予定のゲームは、床となるオブジェクトがいくつか重なっている状況ですから、この当たり判定のままでは使用できません。
Box2Dで当たった頂点を取得することが出来るのならば、上から当たったのか下から当たったのか判定するだけでOKなんですが、もし出来ないとすると、マリオの頭側と足側に小さい箱を作ってその箱と床の当たり判定を調べる必要がありそうですね。

今回のゲーム作成、Box2D関係をまだまだ調べる必要はありますが、面倒な当たり判定部分をBox2Dに丸投げできる分、楽が出来そうですー。