Delphi アプリケーションでの Box2D の使用

提供: RAD Studio
移動先: 案内検索

Box2D への移動


このトピックでは、Delphi アプリケーションでの Box2D の使用方法について説明します。

Box2D を使用するためのアプリケーションの構成

RAD Studio には、Box2D 関連の Delphi ユニットのビルド済み .dcu ファイルが用意されていません。Box2D 関連ユニットが uses 句に含まれている Delphi プロジェクトをビルドできるようにするには、ビルド時にそれらの Box2D 関連ユニットが見つかるようにプロジェクトの検索パスを構成する必要があります。

ビルド時に Box2D 関連ユニットが見つかるように Delphi プロジェクトの検索パスを構成するには:

  1. [プロジェクト|オプション...|Delphi コンパイラを選択します。
  2. [検索パス]フィールドに $(BDS)\source\FlatBox2D を追加します。

これで、コードにこれらのユニットの参照を追加して、Box2D を使用できるようになりました。

Box2D の使用

Box2D の Delphi バインディングは C++ API に基づいていますが、顕著な違いがいくつかあります。

メモ: Box2D の Delphi バインディングを使用するには、ポインタ拡張識別子を熟知していなければなりません。

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 ダイナミックリンク ライブラリ ファイルがアプリケーションの配置対象ファイルに含まれていることになります。

関連項目

サンプル