プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

cocos2d 物理エンジン

cocos2dで作るiPhone&iPadゲームプログラミング12章

cocos2dにはBox2DとChipmunkという2つの物理エンジンが含まれている。
※この記事のコードは最新のBox2Dとは異なる部分がある

物理エンジンの基礎概念

オブジェクトのアニメーションシステム。スプライトを剛体という物理オブジェクトに結びつけ同期する。
ボディには動的と静的がある。
静的ボディ同士は互いに衝突しないが、動的ボディは他の動的・静的ボディと衝突する。
動的ボディのパラメータ。密度(質量)、摩擦、反発
ボディは範囲を決定する1つ以上の図形(シェイプ)で構成される。
シェイプは円、四角形、多角形、頂点、直線。
衝突ごとに交差するポイント接触点が生成される。
ボディはジョイントによってつなぎ合わせることができる。

Box2DとChipmunk

どちらを選ぶかは好み。Box2DはC++、ChipmunkはCで書かれている。
Box2Dのほうが利点は多い。

Box2D

プロジェクトからCocos2d Box2dで作成する。
C++なので.mではなく.mmを使う。

Box2Dのワールド

物理エンジンが表現する物理ワールドの型、b2World。

b2Vec2 gravity = b2Vec2(0.0f, -10.0f);//重力ベクトルの初期値
bool allowBodiesToSleep = true;//ボディをスリープするか。スリープ=微小な動作の演算にフラグを立てて処理しない
world = new b2World(gravity, allowBodiesToSleep);

シーンのdeallocではdelete worldする必要がある。

移動をスクリーン内に制限する

//境界で衝突する静的コンテナボディ
b2BodyDef containerBodyDef;
b2Body *containerBody = wold->CreateBody(&containerBodyDef);
//辺ポリゴンを使って4つの辺を作成する
b2PolygonShape screenBoxShape;
int density = 0;
//底辺
screenBoxShape.SetAsEdge(lowerLeftCorner, lowerRightCorner);
containerBody->CreateFixture(&screenBoxShape, density);
//上辺
screenBoxShape.SetAsEdge(upperLeftCorner, upperRightCorner);
containerBody->CreateFixture(&screenBoxShape, density);
//左辺
screenBoxShape.SetAsEdge(upperLeftCorner, lowerLeftCorner);
containerBody->CreateFixture(&screenBoxShape, density);
//右辺
screenBoxShape.SetAsEdge(upperRightCorner, lowerRightCorner);
containerBody->CreateFixture(&screenBoxShape, density);

Box2D内の単位はMKS(メートル、キログラム、秒)
Box2Dは大きさが0.1〜10の時に最も効果を発揮。
オブジェクトの大きさは1メートル前後がいい。大きすぎたり小さすぎたりすると不具合が出る可能性がある。

ポイントを変換する

b2Vec2構造体とCGPointは相互変換できるようにしておくと便利。

ワールドによる物理シミュレーションの流れ

ボディの定義とスプライト作成→updateでStepメソッドを呼び出す→ボディの位置と角度を取得→スプライトに割り当てる
Stepメソッドは3つのパラメータを受け取る。
1つはtimeStep。前のステップからの経過時間。デルタはおすすめしない。
2と3は反復処理の回数。物理演算の正確さと計算時間を左右する。

衝突を検出する

コールバックするにはb2ContactListenerをサブクラス化して、ワールドに追加する。

ジョイント

ボディ同士を結合する。
b2WorldのCreateJointメソッドによって作成する。
※どのボディからでもGetWorldメソッドでワールドが取得できる。

Chipmunk

Objective-Cラッパーは有償と無償の2つがある。

Chipmunkのスペース

Box2Dのワールド

参考:

cocos2dで作る iPhone&iPadゲームプログラミング

cocos2dで作る iPhone&iPadゲームプログラミング