Ist Object ein CModelObject oder ein CTextureObject ?
-
Hi zusammen.
Ich habe in einem Spiel folgende Klassen:class CObject { ... }; class CModelObject: public CObject { Model... ... }; class CTextureObject: public CObject { Texture... ... };Ich speichere alle Objekte als CObject ab. Nun will ich aber beim Kollisionstest mit einem CModelObject auf das Modell zugreifen. Eigentlich kein Problem, da man das Objekt ja in ein CModelObject umwandeln kann. Aber woher weiß ich, ob ich es mit einem CModelObject oder einem CTextureObject zu tun habe?
In Delphi kann man es mit dem is-Operator machen:
if Object is CModelObject then ...Vielen Dank im Voraus
-
Anstatt so rumzupfuschen solltest du einfach ein sauberes Design entwickeln..
-
Hallo,
z.Bsp. mit dynamic_cast. Wenn der cast nicht erfolgreich war gibt er Null zurück.
@lolz
Da kann man manchmal nichts machen, wenn man eine Bibliothek verwendet, die so aufgebaut ist.
-
Per RTTI oder eigenem Typeinfosystem.
-
Braunstein schrieb:
@lolz
Da kann man manchmal nichts machen, wenn man eine Bibliothek verwendet, die so aufgebaut ist.SomeBody schrieb:
Ich speichere alle Objekte als CObject ab.
-
Ok,
Wenn er selbst das so macht, dann ist er natürlich auch selbst schuld. Ich habe nur mal so über meine Erfahrungen mit der VCL nachgedacht.
-
Erst mal danke für die Tipps. Ich hatte leider noch keine Zeit etwas auszuprobieren, aber dynamic_cast sieht vielversprechend aus...
Aber ich verstehe nicht, was ihr meinen Ansatz, alle Objekte in einem Array vom Typ CObject zu speichern, nicht so gut findet. Meint ihr, es wäre sinnvoller für alles Nachkommen von CObject ein Array zu erstellen, oder wie?
-
Hallo
gegen das Array aus Basisklassen-Zeigern ist nichts einzuwenden.
Allerdings ist es sehr uneleganht, im späteren Verlauf wieder die genaueKlasse einer solchen Instanz expliziet erhausfinden zu müssen. Sondern das sollte durch den gezielten Einsatz der Polymorphie nicht nötig sein.
Natülich ist CObjekt eine viel zu allgemeine Klasse, um effektive Basisklasse zu sein. Dein Array sollte schon einen genau bestimmten Zweck haben, dem alle Elemente entsprechen müßen. Und ob da Texturen und 3D-Models in einen Container gehören, ist sehr fraglich.
Sinnvoller wäre ein Array für Texturen, basierend auf einer Basisklasse CBaseTexture (meinetwegen diese noch von CObject abgeleitet). Und ein Array von CBaseModel.Der Vorteil ist nun, das du über das Model-Array itereiren kannst, sicher sein kannst das nur "kollisionswürdige" Objekte dort vorhanden sind und du auch gleich die richtigen Methoden zur Behandlung anwenden kannst.
bis bald
akari
-
Hmm, ich glaube, da habt ihr mich teilweise falsch verstanden. CObject ist die Basisklasse für ein Objekt (Gegenstand), das irgendwo in der Spielwelt steht. CModelObject ist einfach ein Objekt, das durch ein 3D-Modell dargestellt wird, und CTextureObject ist ein Objekt, das nur durch eine Textur dargestellt wird. Das hat den Hintergrund, das ich simple Objekte nicht als 3D-Modell darstellen will, sondern nur durch die Textur: Das könnte z.B. ein Bild an der Wand sein oder ein Teppich. Diese simplen Objekte sollen dann aber auch kollisionswürdig sein, damit z.B. eine bestimmte Aktion ausgelöst werden kann, wenn der Spieler auf dem Teppich steht.
Die Unterscheidung brauche ich nur, damit ich bei CModelObject auf eine Kollision mit einem Modell und bei CTextureObject auf eine Kollision mit einem Rechteck (bzw. Quader mit geringer Dicke) testen kann..
-
Ach so. Dazu gibt's sogar praktischerweise einen Artikel hier im "Magazin": www.c-plusplus.net/forum/viewtopic-var-t-is-159235.html
-
Also eigentlich ist doch CTextureObject und CModelObject eh das selbe. Beides hat mindestens 3 Punkte, mämlich das allseits bekannte Dreieck.
Ich würde in dein Array CObjects aufnehmen und CObject eine Methode zur Kollisionserkennung geben, die dann in TextureObject und ModelObject unterschiedlich implementiert sind.
Somit brauchst du nicht mehr zu unterscheiden ob es ein Texture oder ein ModelObject ist.Überhaupt deutet das auf ein sehr schlechtes Design, wenn man zur Laufzeit überprüfen muss welche Klasse ein Objekt hat.