2012年3月16日金曜日

Cocos2dに最新のBox2Dを入れてみる

Cocos2d 1.1 beta2 がリリースされましたが、同梱されている Box2D は古いままのようです。
今現在、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 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...