Verwenden von Box2D in Delphi-Anwendungen
Nach oben zu Box2D
In diesem Thema wird die Verwendung von Box2D in Delphi-Anwendungen beschrieben.
Inhaltsverzeichnis
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:
- Wählen Sie Projekt > Optionen > Delphi-Compiler.
- 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:
- Als Record mit dem Originalnamen der Box2D-Klasse. Siehe Verwenden von Box2D-Records.
- Als Record mit dem Originalnamen der Box2D-Klasse und dem Suffix
Wrapper
. Beispielsweise wäre der Wrapper vonb2World
b2WorldWrapper
. Siehe Verwenden von Box2D-Wrapper-Records.
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\21.0\bin\FlatBox2DDyn.dll
- 64-Bit-Windows:
C:\Program Files (x86)\Embarcadero\Studio\21.0\bin64\FlatBox2DDyn.dll
- 32-Bit-macOS:
C:\Program Files (x86)\Embarcadero\Studio\21.0\binosx32\libFlatBox2DDyn.dylib
- 64-Bit-macOS:
C:\Program Files (x86)\Embarcadero\Studio\21.0\binosx64\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
- Box2D Hello World (Delphi)
- Box2D Hello (Beispiel)
- Box2D TestBed (Beispiel)
- FMX SimplePhysics (Beispiel)