2016-06-12 15 views
0

Ich erstelle ein Kollisionssystem für ein Spiel und habe eine Reihe von Bounding Volume-Klassen (AABB, OBB, 18DOP usw.) und sie sind ein Kind von "GameObjectElement" (abstrakte Klasse) . Die Idee jedes Spielobjekts kann einen Vektor von GameObjectElements enthalten.Konvertiere Eltern zurück zu Kind ohne Casting

Das Problem ist, wenn ich einen AABB erstellen und es an ein GameObject anfügen, wird jetzt ein GameObjectElement. Um jedoch nach einer Kollision zu suchen, brauche ich eine AABB und kein GameObjectElement.

Mein erster Instinkt war Gießen, aber während der Universität verachtete mein Dozent dies. Ich habe mich mit Polymorphismus und Upcasting und Downcasting beschäftigt, kann aber keine Lösung zusammensetzen (obwohl ich denke, dass ich alle Teile zum Puzzle habe).

Wenn jemand einen Weg vorschlagen kann, um dieses Problem zu beheben, würde es sehr geschätzt werden.

Danke

+0

Randbemerkung: Wenn Ihr Vektor 'GameObjectElement' Typen enthält, werden Sie möglicherweise Objekt Slicing Probleme laufen in. Wenn es Zeiger auf "GameObjectElement" -Typen enthält, kann die Leistung aufgrund von konstanten Cache-Fehlern schlecht sein, wenn die Objekte nicht in einer Cache-freundlichen Konfiguration im Speicher abgelegt werden. – RyanP

Antwort

0

Wenn Sie verschiedene Mitglieder einer Klassenhierarchie speichern möchten, können Sie in der Regel Zeiger verwenden. (Andere Möglichkeiten sind Varianten und "Chamäleon-Klassen" gleicher Größe). Dies liegt daran, dass Vektoren Elemente desselben Typs und derselben Größe speichern müssen. Was Sie hier brauchen, ist eine reine virtuelle Funktion zur Kollisionsprüfung (z. B. virtual bool collision(const int x, const int y) = 0) in der Basisklasse, eine Implementierung dieser virtuellen Funktion in jedem Nachkommen (z. B. virtual bool collision(const int x, const int y) { return x == m_x && y==m_y; }) und zum Speichern von Zeigern zur Basis im Vektor (z. B. std::vector<GameObjectElement*> v). Dann - Wunder passiert :) - Aufruf v[i]->collision(x, y) wird die entsprechende Implementierung im Nachfahren aufrufen. Achten Sie darauf, Elemente mit new zuzuordnen und mit delete zu löschen - oder verwenden Sie einfach shared_ptr<GameObjectElement>, wenn Sie es in einem cal sehr einfach machen wollen.

+0

Vielen Dank für Ihre Antwort. Ich habe das noch nie zuvor gesehen, hört sich toll an! Ich bin ein bisschen beschäftigt atm, aber ich werde es versuchen, wenn ich die Chance bekomme ^^ – user3047841

+0

Ihr Vorschlag klingt perfekt, nur für eine Sache, wenn ich v [i] -> Kollision (x, y), ich brauche x und y, um die abgeleitete Klasse tatsächlich zu sein, da es eine AABB für die AABB-Prüfung oder ein OBB für die OBB-Prüfung sein muss, während ich es in einer Schleife wie vorgeschlagen rufe wie v [i] -> collision (AABB) ; AABB wird ein GameObjectElement sein – user3047841

0

Wenn die Auswahl von colission Algorithmus hängt von der Art der beiden Instanzen, suchen Sie nach einem Doppel Versand Mechanismus, der in c implementiert werden kann ++ das Muster Besucher tatsächlich mit

Die Wikipedia-Seite hat ein Beispiel, das eine Kollision von Objekten umfasst :)

https://en.wikipedia.org/wiki/Double_dispatch#Double_dispatch_is_more_than_function_overloading

+0

Vielen Dank für Ihre Antwort. Habe noch nie davon gehört, bevor ich mehr gelernt habe. Ich finde es irgendwie verwirrend, also lies noch mehr ^^ – user3047841