今現在、Box2D の最新版は 2.2.1 となっています。
Dynamic オブジェクトの bullet モードを試した方は気づいているかもしれませんが、Cocos2d に同梱されているバージョンの bullet モードは、ちょっと不完全というか、かなり当り抜けしますよ、という仕様(バグ?)でした。
結論から言いますと、最新版の Box2D v2.2.1 では、この bullet モードが改善されています。自分のプログラムで試す限りでは、抜けたところを見ていません。そのかわり処理はすごく重くなる時があります。
その辺りのところは、b2World クラスの SolveTOI() 関数が行なっているので、興味ある方は、新しいバージョンと古いバージョンのソースコードを見比べてみるといいでしょう。
古い Box2D を最新版に入れ替える作業行ってみました。
現行のBox2Dを削除
Xcode プロジェクトから、libs 内の Box2D を削除します。最新のBox2Dを追加
http://code.google.com/p/box2d/から最新版をダウンロードしてきます。Box2D_v2.2.1.zip を展開して、中にある Box2D フォルダを、入れ替えるプロジェクトのフォルダに Finder でコピーします。この時、もともとあった Box2D フォルダと同じ位置にコピーしておくと混乱しなくていいでしょう。
その Box2d フォルダをプロジェクトに追加します。
コンパイルしてエラーを対処する
特に既存プロジェクトから入れ替えた人は、複数箇所でエラーがでると思いますが、僕が試した限りでは、使い方が異なるような大きな変更はなさそうでした。代表的な変更点を記しておきます。
GLES-Render
デバッグ描画クラスが大きく変わりました。自力対処できない方はとりあえず GLES-Render.mm、GLES-Render.h は、中身を#if 0 〜 #endif で囲うなどして無力化して、GLESDebugDraw は使わないようにして下さい。(笑)そこは次回に取り組みたいと思います。(こちらの記事で対応しました=> cocos2d: GLESDebugDrawクラスをBox2D v2.1.1用に修正)
b2PolygonShape
ワールドの外枠に static オブジェクトの壁を作る時に、b2PolygonShape の SetAsEdge()関数を使っている人も多いと思いますが、これは 2.2.1 では廃止されました。代わりに b2EdgeShape というクラスに置き換えます。b2EdgeShape は2点を結ぶ直線を当たり判定とするものなので、この変更はより専門化したクラスに分化されたと見れます。
※このように、いきなりの廃止は Box2D ではよくある事です。でも、ソースをゆっくり読んでいけば、だいたい対処できます。
b2World
b2World クラスのコンストラクタのパラメータから、doSleep が無くなりました。b2Transform
b2Transform クラス(構造体)のメンバ変数が変わりました。回転情報を保持するデータとして b2Mat22 が使われていましたが、新たに b2Rot というクラスが作られて、こちらに置き換わりました。変数名も微妙に変わっています。この辺り、今後また変わるかも…。(笑)
まだまだ変更点はあると思いますが、僕自身まだ追いきれていないので、とりあえず今回はこれまで!
0 件のコメント:
コメントを投稿