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

1

21.08.2013, 21:02

Box2D ContactListener

Moin!
Ich will hiermit mal nach Tipps (oder gar Alternativen?) fragen, die sich auf die Kollisionsabfrage bezieht.
Der ContactListener ist mein Sorgenkind. Nicht nur schreit alles drumherum nach globalen Variablen, (würg) nein sondern auch nach einer übergeordneten Struktur.
Dies will ich erläutern... Man nehme eine Struktur mit einer Variable, die lediglich die Art des Objekts beschreibt. _Alle_ Objekte, die irgendwie was außerhalb von Box2D was mit Box2D zu tun haben müssen nun davon erben, damit man den Typ des Objekts sicher (im Sinne von "secure") bestimmen kann.
Ich wollt hier eben fragen wie ihr das handhabt, ich finde das eigentlich irgendwie nervig, auch wenns nicht allzu viel Arbeit wäre. Trotzdem irgendwo sagt mein Bauchgefühl: "Hässlich."
Was meint ihr dazu?
Nur so bekomme ich es ohne globale Variablen hin, mir fällt einfach nichts anderes ein. Dx

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

21.08.2013, 21:14

Du kannst doch jedem Box2D-Objekt eine Referenz auf Deine eigenen Daten geben. Klar, dass das ein void* ist, aber wo ist da das Problem? Globale Variablen brauchst Du jedenfalls keine. Ich wüsste ehrlich gesagt nicht mal, wie Du auf die Idee überhaupt kommst, dass Du da globale Variablen brauchst!? Details?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

21.08.2013, 21:21

Na bspw. so eine lustige Liste die die Objekte speichert, die etwas machen sollen und... Joa.
Ich bau mich drum rum, geht ja doch ganz gut.
Ok dann kenne ich mich nicht gut genug mit void-Pointern aus. Wie weiß ich auf sichere (secure) Art und Weise von welchem Typ die Daten in dem Pointer sind?

MfG
Check

4

21.08.2013, 21:32

Generell, muss die Klasse die einen void Pointer castet wissen, von welchem Typ der Pointer mal war. Void-Pointer kannst du aber generell ohne jedes Risiko in einen anderen Pointer casten, oder auch andere Pointer in einen void Pointer casten, dabei gehen keine Informationen verloren. Z.B. kann man void Pointer innerhalb eines Ressourcen-Managers ganz gut gebrauchen. Hier ein paar mehr Infos zum Thema ;).

Von einer "sicheren" Art und Weise welcher Datentyp ein void-Pointer mal war, weiß ich nichts, aber evtl. findest du einen Workaround (vllt. eine Art RAII?)

Viele Grüße,
~ EuadeLuxe ~

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

5

21.08.2013, 21:42

Man kann in void* auch Integer speichern:

C-/C++-Quelltext

1
2
void* test = static_cast<void*>(1);
std::cout << static_cast<int>(test) << std::endl;

6

21.08.2013, 21:51

Ich habe mich für meine bisherigen Zwecke schon ausreichend informiert.
Dein Code würde übrigens nicht kompiliert werden.
Jeeeeedenfalls bin ich bisher genauso weit wie vorher, geht es doch explizit um das Erkennen und nicht um den void-Pointer.

MfG
Check

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (21.08.2013, 22:18)


7

21.08.2013, 22:02

@patrick246: Aber nur solange der int so groß ist wie die Adress-Länge deines Pointers, was nicht immer gewähleistet sein muss.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

22.08.2013, 06:45

Jeeeeedenfalls bin ich bisher genauso weit wie vorher, geht es doch explizit um das Erkennen und nicht um den void-Pointer.
Da brauchst Du wohl, wie Du es schon festgestellt hast, einen Wrapper außen drum, der den Typ identifizieren kann. Das kannst Du entweder über ein Struct mit einer enum und einem Pointer lösen oder polymorph durch eine Oberklasse für Deine Objekte. Wir benutzen einen Interface-Typ, der ein physisches Objekt kapselt. Alle Objekte, die in Box2D kollidieren können implementieren dieses Interface. Zudem haben wir das Glück, dass wir so wenig verschiedene Arten von Objekten haben (3, glaub ich :D), dass wir zusätzlich deren Obertyp verwenden können.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

9

22.08.2013, 13:05

Auf dem heutigem Schulweg ist mir eingefallen, dass ich eine rein virtuelle Funktion einer Oberklasse aufrufen könnte. haha :D
Ich werde es mal so probieren, wenn es nicht wie gewollt von Statten geht baue ich wohl einen Wrapper.
Danke! :)

MfG
Check

Werbeanzeige