Delphi アプリケーションでの Box2D の使用
Box2D への移動
このトピックでは、Delphi アプリケーションでの Box2D の使用方法について説明します。
目次
Box2D を使用するためのアプリケーションの構成
RAD Studio には、Box2D 関連の Delphi ユニットのビルド済み .dcu
ファイルが用意されていません。Box2D 関連ユニットが uses
句に含まれている Delphi プロジェクトをビルドできるようにするには、ビルド時にそれらの Box2D 関連ユニットが見つかるようにプロジェクトの検索パスを構成する必要があります。
ビルド時に Box2D 関連ユニットが見つかるように Delphi プロジェクトの検索パスを構成するには:
- [プロジェクト|オプション...|Delphi コンパイラ]を選択します。
- [検索パス]フィールドに
$(BDS)\source\FlatBox2D
を追加します。
これで、コードにこれらのユニットの参照を追加して、Box2D を使用できるようになりました。
Box2D の使用
Box2D の Delphi バインディングは C++ API に基づいていますが、顕著な違いがいくつかあります。
Box2D クラスの Delphi マッピング
Box2D の Delphi バインディングでは、次のいずれかの形で Box2D クラスが公開されます。
- 元の Box2D クラス名と同じ名前のレコードとして公開されます。「Box2D レコードの使用」を参照してください。
- 元の Box2D クラス名の末尾に
Wrapper
の付いたレコードとして公開されます。たとえば、b2World
のラッパーはb2WorldWrapper
になります。「Box2D ラッパー レコードの使用」を参照してください。
どちらの場合も、通常の Delphi レコードとは異なり、これらの Box2D レコードを作成するには、宣言するだけでは不十分です。レコードの Create
手続きを呼び出して、レコードのメンバが必ず正しいデフォルト値を持つようにする必要があります。レコードを宣言するだけで Create
を呼び出さない場合、そのレコードのメンバのデフォルト値は、Box2D で定義されているものと一致しない可能性があります。
groundBodyDef := b2BodyDef.Create;
Box2D レコードの使用
Box2D の Delphi バインディングでは、ほとんどの Box2D クラスをレコードとして提供しています。ただし、ラッパー レコードとして公開されるクラスとリスナ クラスだけは、そうではありません。
Box2D ラッパー レコードの使用
Box2D の Delphi バインディングでは、次のラッパー レコードを提供しています。
b2BlockAllocatorWrapper
b2BodyWrapper
b2BroadPhaseWrapper
b2ChainAndCircleContactWrapper
b2ChainAndPolygonContactWrapper
b2ChainShapeWrapper
b2CircleContactWrapper
b2CircleShapeWrapper
b2ContactWrapper
b2ContactManagerWrapper
b2ContactSolverWrapper
b2DistanceJointWrapper
b2DrawWrapper
b2DynamicTreeWrapper
b2EdgeAndCircleContactWrapper
b2EdgeAndPolygonContactWrapper
b2EdgeShapeWrapper
b2FrictionJointWrapper
b2GearJointWrapper
b2IslandWrapper
b2JointWrapper
b2MotorJointWrapper
b2MouseJointWrapper
b2PolygonAndCircleContactWrapper
b2PolygonContactWrapper
b2PolygonShapeWrapper
b2PrismaticJointWrapper
b2PulleyJointWrapper
b2RevoluteJointWrapper
b2RopeWrapper
b2RopeJointWrapper
b2ShapeWrapper
b2StackAllocatorWrapper
b2WeldJointWrapper
b2WheelJointWrapper
b2WorldWrapper
Box2D レコードおよびラッパー レコードの解放
解放する必要がある Box2D 関連レコードまたはラッパー レコードは b2WorldWrapper
のインスタンスだけです。b2WorldWrapper
のデストラクタでは、b2WorldWrapper
オブジェクトの本体、フィクスチャ、ジョイントに割り当てられているメモリをすべて解放します。
ただし、次のものはこのルールに当てはまりません。
- さまざまな ShapeWrapper
- C++ で明示的に作成され破棄されるその他のラッパー
world.Destroy;
Box2D リスナも、このルールに当てはまりません。
Box2D リスナの定義
Box2D には、リスナ クラスがいくつか定義されています。C++ を使用している場合は、リスナのサブクラスの作成、サブクラスのインスタンスの作成、ワールド(b2World
)などの何らかの Box2D オブジェクトへのリスナ オブジェクトの登録を行えます。
特定の型の Box2D リスナ オブジェクトを Delphi で作成するには、ターゲットとなる Box2D リスナ クラスのインターフェイスを実装するカスタム クラスを定義する必要があります。Box2D リスナ クラスのインターフェイスの名前は、Box2D リスナ クラスの名前の前に大文字の I
を付けたものになります。たとえば、Ib2ContactListener
は Box2D リスナ クラス b2ContactListener
のインターフェイスです。
TMyContactListener = class (TInterfacedObject, Ib2ContactListener)
public
procedure BeginContact(contact: NativeUInt); cdecl;
procedure EndContact(contact: NativeUInt); cdecl;
procedure PostSolve(contact: NativeUInt; impulse: Pb2ContactImpulse); cdecl;
procedure PreSolve(contact: NativeUInt; oldManifold: Pb2Manifold); cdecl;
end;
ターゲットのリスナ インターフェイスを実装するクラスができあがったら、そのクラスのインスタンスを作成する必要があります。
myContactListener := TMyContactListener.Create;
リスナ設定アクセサではリスナ オブジェクトを直接操作できません。代わりに、リスナ オブジェクトのデリゲート(NativeUInt
型)を取得して、そのデリゲートをリスナ設定アクセサに渡す必要があります。Create_<リスナ クラス>_delegate
を使用すると、リスナ オブジェクトのデリゲートを作成できます。
myContactListenerHandle := Create_b2ContactListener_delegate(myContactListener);
world.SetContactListener(myContactListenerHandle);
Box2D ワールドを破棄したら、リスナ オブジェクトのハンドルを Destroy_<リスナ クラス>_delegate
に渡して、リスナ オブジェクトを破棄することができます。
world.Destroy;
Destroy_b2ContactListener_delegate(myContactListenerHandle);
アプリケーションの配置
デスクトップ プラットフォームでは、アプリケーションと一緒に RAD Studio Box2D ダイナミックリンク ライブラリを配布する必要があります。
RAD Studio Box2D ダイナミックリンク ライブラリ ファイルの場所と名前は次のとおりです。
- 32 ビット Windows の場合:
C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\FlatBox2DDyn.dll
- 64 ビット Windows の場合:
C:\Program Files (x86)\Embarcadero\Studio\20.0\bin64\FlatBox2DDyn.dll
- 32 ビット macOS:
C:\Program Files (x86)\Embarcadero\Studio\20.0\binosx32\libFlatBox2DDyn.dylib
- 64 ビット macOS:
C:\Program Files (x86)\Embarcadero\Studio\20.0\binosx64\libFlatBox2DDyn.dylib
アプリケーションでサポートするターゲット プラットフォームごとに、このライブラリ ファイルを配置マネージャに追加します。その結果、どのようなデスクトップ プラットフォームにアプリケーションを配置する場合でも、この RAD Studio Box2D ダイナミックリンク ライブラリ ファイルがアプリケーションの配置対象ファイルに含まれていることになります。
関連項目
サンプル
- Box2D Hello World(Delphi)
- Box2D Hello サンプル
- Box2D TestBed サンプル
- FMX SimplePhysics サンプル