Objekt Methode als Procedure übergeben. [gelöst]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1641
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Objekt Methode als Procedure übergeben. [gelöst]

Beitrag von corpsman »

Guten Morgen allerseits,

Ich versuche mich gerade mal wieder an der Newton Physik Engine. Im Speziellen habe ich ein Spiel, in welchem es jede Menge "Objekte" gibt. Diese Objekte will ich nun in die Newtonwelt einbinden, das mache ich mehr oder weniger in dem ich die unten stehende Routine aufrufe :

Code: Alles auswählen

 
type
  NewtonApplyForceAndTorque = Procedure(Const body: PNewtonBody; timestep: Float; threadIndex: int); cdecl;
 
Procedure NewtonBodySetForceAndTorqueCallback(Const body: PNewtonBody; callback: NewtonApplyForceAndTorque); cdecl; external{$IFDEF __GPC__}name 'NewtonBodySetForceAndTorqueCallback'{$ELSE}NewtonDLL{$ENDIF __GPC__};
 
Mein Problem ist nun, dass meine Objekte alle irgendwo von TObject Abgeleitet sind (Also echte Objekte im Sinn der Objektorientierten Programmierung).

Die Callbach Routine darf zumindest nach der Definition wie sie oben steht, keine Objekt Methode sein ( zudem ist sie noch in C Notation).

Nun kann ich mir natürlich was basteln, dass ich meine Objekte Global verfügbar macht und dann eine normale Routine als Callback übergibt, doch irgendwie wäre es mir viel lieber, wenn ich die Objektbezogene Routine

Code: Alles auswählen

 
type tBlabla =class
private
public
Procedure ForceAndTorqueCallback_LevelObjects(Const body: PNewtonBody; timestep: Single; threadIndex: integer); cdecl;
Procedure InitNewton();
end;
var bla:TBlabla;
 
Übergeben könnte, ein einfaches :

Code: Alles auswählen

 
Procedure TBlabla.InitNewton();
Begin
 
  FWoodBall.InitNewton(nil, @ForceAndTorqueCallback_LevelObjects);
End;
 
geht hier ja leider nicht.

So meine Frage, weis hier jemand wie man es trotzdem machen kann, oder bleibt mir tatsächlich nur der Weg über die "Globale" Procedur ?
Zuletzt geändert von corpsman am Sa 26. Jan 2013, 19:02, insgesamt 1-mal geändert.
--
Just try it

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Object Methode als Procedure übergeben.

Beitrag von Socke »

Du musst wohl oder übel eine normale Funktion oder Prozedur (je nach Anforderung) als Callback schreiben. Häufig kann man bei Callbacks einen Parameter selbst angeben, der dann der Callback-Funktion übergeben wird. Dort gibst du dein Objekt an und schon kannst du in deinem Callback wieder objektorientiert arbeiten.

Alles andere geht nicht oder wäre kein sauberer Programmierstil.

Inwiefern das auf die Newton Physik Engine zutrifft, kann ich leider nicht sagen; ich kenn die nicht.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1641
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Object Methode als Procedure übergeben.

Beitrag von corpsman »

Das hatte ich schon befürchtet, danke für die Bestätigung, muss mal suchen ob ich an den NewtonBody Userdaten anhängen kann..

[Edit]

das gibts tatsächlich :), damit kann ich es dann sauber machen, danke nochmal...

Code: Alles auswählen

Procedure NewtonBodySetUserData(Const body: PNewtonBody; userData: Pointer); cdecl; 
--
Just try it

Antworten