Verwenden von Box2D in Delphi-Anwendungen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Box2D


In diesem Thema wird die Verwendung von Box2D in Delphi-Anwendungen beschrieben.

Konfigurieren Ihrer Anwendung für die Verwendung von Box2D

RAD Studio enthält keine vorerzeugten .dcu-Dateien für Box2D-Delphi-Units. Zum Erzeugen eines Delphi-Projekts, das Box2D-Units in der uses-Klausel enthält, müssen Sie den Suchpfad Ihres Projekts so konfigurieren, dass RAD Studio die Box2D-Units finden kann.

So konfigurieren Sie den Suchpfad Ihres Delphi-Projekts so, dass RAD Studio die Box2D-Units finden kann:

  1. Wählen Sie Projekt > Optionen > Delphi-Compiler.
  2. Fügen Sie dem Feld Suchpfad den Eintrag $(BDS)\source\FlatBox2D hinzu.

Sie können nun Ihrem Code Referenzen auf diese Units hinzufügen, damit Sie Box2D verwenden können.

Verwenden von Box2D

Die Delphi-Bindungen für Box2D basieren auf der C++-API (EN); es gibt jedoch einige wichtige Unterschiede.

Hinweis: Für die Verwendung der Delphi-Bindungen für Box2D sollten Sie mit Zeigern und erweiterten Bezeichnern vertraut sein.

Delphi-Zuordnung von Box2D-Klassen

Die Delphi-Bindungen für Box2D stellen Box2D-Klassen auf eine der folgenden Arten bereit:

In beiden Fällen ist im Gegensatz zu regulären Delphi-Records die Deklaration dieser Box2D-Records nicht ausreichend, um sie zu erstellen. Sie müssen deren Create-Prozedur aufrufen, um sicherzustellen, dass deren Member die richtigen Standardwerte erhalten. Wenn Sie einen Record deklarieren und Create nicht aufrufen, könnten die Standardwerte der Member nicht mit denjenigen übereinstimmen, die Box2D definiert.

groundBodyDef := b2BodyDef.Create;

Verwenden von Box2D-Records

Die Delphi-Bindungen für Box2D stellen die meisten Box2D-Klassen als Records bereit. Die einzigen Ausnahmen bilden als Wrapper-Records bereitgestellte Klassen und Listener-Klassen.

Verwenden von Box2D-Wrapper-Records

Die Delphi-Bindungen für Box2D stellen die folgenden Wrapper-Records bereit:

  • 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

Freigabe von Box2D-Records und -Record-Wrappern

Die einzigen Box2D-Records oder -Record-Wrapper, die Sie freigeben müssen, sind Instanzen von b2WorldWrapper. Der Destruktor von b2WorldWrapper gibt den durch Körper, Inventarstücke oder Verbindungen im b2WorldWrapper-Objekt zugewiesenen Speicher frei.

Ausnahmen von dieser Regel:

  • ShapeWrapper
  • Andere Wrapper, die Sie explizit erstellen und die in C++ freigegeben werden
world.Destroy;

Box2D-Listener gehören ebenfalls zu den Ausnahmen von dieser Regel.

Definieren von Box2D-Listenern

Box2D definierte einige Listener-Klassen. Wenn Sie C++ verwenden, können Sie Unterklassen eines Listeners anlegen, eine Instanz Ihrer Unterklasse erstellen und Ihr Listener-Objekt in einem Box2D-Objekt registrieren, wie z. B. "Welt" (b2World).

Um ein Box2D-Listener-Objekt eines bestimmten Typs in Delphi zu erstellen, müssen Sie eine benutzerdefinierte Klasse definieren, die das Interface der Ziel-Box2D-Listener-Klasse implementiert. Das Interface einer Box2D-Listener-Klasse wird wie die Box2D-Listener-Klasse, aber mit dem Präfix I benannt. Ib2ContactListener ist beispielsweise das Interface der b2ContactListener-Box2D-Listener-Klasse.

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;

Wenn Sie eine Klasse angelegt haben, die das Ziel-Listener-Interface implementiert, müssen Sie eine Instanz dieser Klasse erstellen.

myContactListener := TMyContactListener.Create;

Listener-Setter-Methoden können Ihr Listener-Objekt nicht direkt behandeln, sondern Sie müssen einen Delegaten (mit dem Typ NativeUInt) für Ihr Listener-Objekt abrufen und diesen Delegaten an die Listener-Setter-Methode übergeben. Verwenden Sie Create_<Listener-Klasse>_delegate, um einen Delegaten Ihres Listener-Objekts zu erstellen.

myContactListenerHandle := Create_b2ContactListener_delegate(myContactListener);
world.SetContactListener(myContactListenerHandle);

Nach der Freigabe der Box2D-Welt können Sie das Listener-Objekt freigeben, indem Sie sein Handle an Destroy_<Listener-Klasse>_delegate übergeben.

world.Destroy;
Destroy_b2ContactListener_delegate(myContactListenerHandle);

Bereitstellen Ihrer Anwendung

Auf Desktop-Plattformen müssen Sie die dynamische RAD Studio-Box2D-Bibliothek zusammen mit Ihrer Anwendung weitergeben.

Die dynamische RAD Studio-Box2D-Bibliotheksdatei befindet sich in:

  • 32-Bit-Windows: C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\FlatBox2DDyn.dll
  • 64-Bit-Windows: C:\Program Files (x86)\Embarcadero\Studio\20.0\bin64\FlatBox2DDyn.dll
  • OS X: C:\Program Files (x86)\Embarcadero\Studio\20.0\binosx32\libFlatBox2DDyn.dylib

Fügen Sie dem Bereitstellungs-Manager diese Bibliotheksdatei für jede Zielplattform hinzu, die Ihre Anwendung unterstützt, damit sich bei der Bereitstellung Ihrer Anwendung für eine beliebige Desktop-Plattform die dynamische RAD Studio-Box2D-Bibliotheksdatei unter den bereitgestellten Dateien Ihrer Anwendung befindet.

Siehe auch

Beispiele