読者です 読者をやめる 読者になる 読者になる

Haruyuki Mohri

毛利春幸のブログです。

Delphi版 Box2D 2D物理演算エンジン 基礎 入門

qiita.com

Delphi XE8 から Box2Dが標準で入っています。

以前までは 下記のブログのように「box2d-delphi」を組込む必要がありました。

Team Japan » C++Builder XE2 - FireMonkey 2D/HDアプリに Box2D を組み込む
Team Japan » Delphi XE2 - FireMonkey 2D/HDアプリに box2d-delphi を組み込む

Box2D

Box2Dは元々C++で作られたライブラリです
Box2Dで検索するとActionScriptJavaScriptの記事がたくさん出てきます。
本家URLは http://box2d.org です。 英語ですが ここのマニュアルは解りやすくておすすめです。

uses

Box2D.Common, Box2D.Collision, Box2D.Dynamics, Box2DTypes

Get_b2_version

Get_b2_versionは 2.3.2になってました。

b2WorldWrapper(ワールド)を作る

まずは重力のあるワールドを作ります。

var
  world: b2WorldWrapper;
begin
  world := b2WorldWrapper.Create(b2Vec2.Create(0.0, -5.0));
end;

b2BodyDefをworldに登録します。

var
  bodyDef: b2BodyDef;
  body: b2BodyWrapper;
begin
  bodyDef := b2BodyDef.Create();
  bodyDef.&type := b2_DynamicBody;  //動く物体(b2_staticBodyなら動かないものです)
  bodyDef.position.&Set(posX, posY);  //初期のポジション
  bodyDef.angle := angle; //角度
  body := world.CreateBody(@bodyDef);  //ワールドに登録
end;

Shape(形)を決めます

b2PolygonShapeWrapper, b2EdgeShapeWrapper, b2CircleShapeWrapper などがあります
b2PolygonShapeWrapperは指定しない場合四角として使えるみたいです

var
  b2shape: b2PolygonShapeWrapper;
begin
  b2shape := b2PolygonShapeWrapper.Create();
  b2shape.SetAsBox(x, y); //中心からの距離
end;

b2FixtureDef でボディに形や密度、摩擦、反発を設定

var
  body: b2BodyWrapper;
  fixtureDef: b2FixtureDef;
begin
  fixtureDef := b2FixtureDef.Create();
  fixtureDef.shape := b2shape;//先ほど作成した形を登録する
  fixtureDef.density := 1.0; //密度
  fixtureDef.friction := 0.1; //摩擦
  fixtureDef.restitution :=0.7; //反発
  body.CreateFixture(@fixtureDef);  //先ほど作成したボディに登録
end;

bodyを落下する

bodyを落下させるだけなら上記の設定だけでOKです b2BodyWrapperにハンドル(FHandle: b2BodyHandle;)がありますので bodyに設定するとポジション(b2Vec2)と角度(Single)が参照できます。

    body.FHandle := ハンドル設定;
    bodyPos := body.GetPosition^;
    angle := body.GetAngle;

時間をステップする。

タイマーなどで ワールド内の時間をステップさせていきます

world.Step(1/60, 6, 2);

ステップさせた後にポジションを再取得すると落下した値が取得できます。