Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Paul_C.

Frischling

  • »Paul_C.« ist der Autor dieses Themas

Beiträge: 81

Wohnort: Duisburg

  • Private Nachricht senden

1

25.08.2006, 12:38

Callback-Funktionen in Klassen?!

Also, ich habe eine Nachrichtenschleife in denen ich gerne Callbackfunktionen zum Rendern und Bewegen nutzen möchte. Nur möchte ich diese Funktionen ungern 'global' erstellen, sondern als Klassenfunktionen.
David nutzt ja einen Trick, indem er globale und Klassen-Render-Move-Funkionen erstellt und an die TriBase-Schleife weiterreicht. Das kann er machen, da er ja auch viele globale Variablen nutzt und somit in den globalen Funktionen auf die Direct3DInit-Klasse (und somit letztendlich auch auf die Methoden) zugreifen kann.
Ich hingegen möchte gerne komplett auf globale Variablen verzichten (was bis jetzt auch gut funktioniert), dann meckert der Compiler aber, dass er die übergebenen Funktionen nicht konvertieren kann.
Bsp:
Die Schleife hat den Funktionskopf:
BOOL RenderMoveLoop (BOOL (*RenderProc)(float), BOOL (*MoveProc)(float));

Die Klassenmethoden sehen so aus:

CEngine::Render(float fTime);
CEngine::Move(float fTime);

Ich habe es schon mit CALLBACKs versucht, bin daran aber gescheitert.
Kann man es also überhaupt ohne globalen Funktionen/Variablen hinbekommen?

Wäre für ne Antwort dankbar. Meinetwegen reicht auch ein Hinweis. Vielleicht übersehe oder vergesse ich gerade was. ;)

MfG,
Paul.

EDIT: Da stellt sich mir doch die Frage, ob ich überhaupt eine Schleifenfunktion ausserhalb brauche? Ich kann doch einfach die Schleife in eine Methode packen....

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

2

25.08.2006, 13:13

static
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Paul_C.

Frischling

  • »Paul_C.« ist der Autor dieses Themas

Beiträge: 81

Wohnort: Duisburg

  • Private Nachricht senden

3

25.08.2006, 13:15

Bitte genauer.
Hatte selber schon static BOOL CALLBACK .... ausprobiert?!
oder auch nur static BOOL.
Dann mit CEngine::Move übergeben. Führte auch zu keinem Ergebnis.

Habe dies nun ohne CALLBACK realisiert und scheint gut zu laufen. ;)

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

4

25.08.2006, 14:51

Theoretisch brauchst du nur eine Methode als static zu deklarieren... und volá funktionierts auch mit funktionspointern...
Ka was du da falsch gemacht hast... :S
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Paul_C.

Frischling

  • »Paul_C.« ist der Autor dieses Themas

Beiträge: 81

Wohnort: Duisburg

  • Private Nachricht senden

5

25.08.2006, 15:13

Hm, kA. Vielleicht versuche ich es bei Gelegenheit nochmal. Momentan gefällt mir meine Lösung zu gut. :) Sehe keinen Sinn, jetzt noch CALLBACK-Funktionen zu nutzen.

Dennoch, danke.

MfG,
Paul.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

25.08.2006, 15:18

das problem ist, dass du keine memberfunktion (ausgenommen static) über einen einfachen funktionszeiger aufrufen kannst, da du zum aufrufen eine instanz der klasse benötigst für den this pointer...

Paul_C.

Frischling

  • »Paul_C.« ist der Autor dieses Themas

Beiträge: 81

Wohnort: Duisburg

  • Private Nachricht senden

7

25.08.2006, 15:23

Ja, das ist mir klar, aber wie gesagt, die Memberfunktion hatte ich zu Beginn erst als Static deklariert. Der Compiler meckert dann, dass er die Parameter dennoch nicht konvertieren kann.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

25.08.2006, 15:43

klar, weil die aufrufkonvention nicht stimmt.

wenn dann müsstest dus so in der art machen:

C-/C++-Quelltext

1
BOOL RenderMoveLoop (BOOL (CEngine::*RenderProc)(float), BOOL (CEngine::*MoveProc)(float));

Paul_C.

Frischling

  • »Paul_C.« ist der Autor dieses Themas

Beiträge: 81

Wohnort: Duisburg

  • Private Nachricht senden

9

25.08.2006, 16:10

Hm, das könnte es sein...
So habe ich es tatsächlich nicht ausprobiert. Vielen Dank dafür.
Gibt es denn Nachteile, wenn meine RenderMoveLoop eine Methode meiner Engine-Klasse ist? So habe ich es jetzt gemacht. In der Rufe ich einfach nacheinander: Render() und Move() auf.

Sollte meiner Meinung nach keinen (kaum) Unterschied machen, als wenn ich eine globale RenderMove-Funktion aufrufe und die Funktionspointer übergebe.

Werbeanzeige