C++ & Reflection
Verfasst: 07.08.2010, 17:04
Prinzipiell ist in meinem Spiel jedes Objekt ein Entity, welches verschiedene Komponenten hat. Ein Schwert, das am Boden liegt würde die entsprechenden Item Eigenschaften speichern, ein Charakter hat seine Charakterwerte und so weiter. Jeder Charakter kann auch unterschiedliche Aktionen ausführen (Stehen, Laufen, Angreifen), jede Aktion wird auch wieder durch eine Klasse repräsentiert.
Das System ist soweit ganz hübsch und funktioniert auch gut, man ist auch direkt wahnsinnig flexibel und alles, nur jetzt wird es sehr hässlich, wenn ich das ganze Laden und Speichern will.
Ich würde zum speichern eines Objektes alle Member durchgehen und speichern, einfache (ints) schreibt man direkt komplexere (andere Objekte) haben jeweils eine eigene Speicherfunktion.
Allerdings bekomme ich dadurch natürlich einen riesigen Overhead, eine LaufAktion speichert ja letztendlich nur ein Ziel und die Laufgeschwindigkeit. Wenn ich ja jetzt lade und Speicherfunktionen für schreibe, ist die Klasse direkt doppelt so groß. Noch schlimmer wird es, wenn ich für den Leveleditor alle Parameter aller Objekte ändern können will und dafür GUI Elemente erstellen muss.
Die einzelnen Funktionen sind dann natürlich alle sehr ähnlich, und es ist ermüdend, die immer tippen zu müssen.
Darum versuche ich jetzt irgendwas in Richtung Reflection zu machen. Leider kann C++ das nicht. Und ich habe bisher keine Lösung gefunden, die nicht irgendwie äußerst hässlich wäre.
Hinzu kommt, dass zum Beispiel das laden an sich gar nicht so einfach ist. Wenn man einen Pointer auf ein anderes Entity speichern will, würde man das ja wahrscheinlich durch eine ID ersetzen die man beim Laden wieder durch einen Pointer ersetzen muss, was erst geht, wenn man alle anderen geladen hat.
Ich hab jetzt hin und her überlegt, wie ich das ganze am schönsten machen kann. Man könnte versuchen, alle Klassen von einer Reflectable Klasse erben zu lassen, die Pointer auf alle Member speichert und die man in jedem Konstruktor dann entsprechend befüllt. Funktioniert wohl, aber man speichert dann alles für jedes Objekt, wobei alle Objekte einer Klasse natürlich die selben Member haben.
Wenn man versucht die Infos pro Klasse zu speichern hat man so Probleme wie das Adressen relativ zum this Zeiger nicht mehr Stimmen, wenn man Vererbung benutzt.
Dann gibt es da noch sowas wie Camp. Naja, die Dokumentation ist ziemlich mies, und es scheint so als würde man Member per Getter und Setter ansprechen müssen, und sowas mag ich nicht. Und um an die Member direkt ran zu kommen, muss man deren Typ kennen, der dann nur per enum gespeichert wird und dann muss man wieder switchblöcke machen und so. Insgesamt kann ich noch nicht sehen, was dadran jetzt schöner ist, als an einer selbst programmierten frickel Lösung, und zusätzliche Bibliotheken sind ja erstmal immer schlecht.
Es muss ja vielleicht auch gar kein Reflektion sein, vielleicht findet man ja eine schöne Lösung, wie man zumindest das Laden/Speichern/Editor GUI ELement erstellen und "Methoden bei Skriptsprache registrieren" einfacher und kürzer hinbekommt. Jede Klasse könnte eine Methode haben, die alle Member durchgeht und dafür ein ihr übergebenes Funktionsobjekt aufruft, was man dann passend für den jeweiligen Zweck übergeben könnte, oder so. Wäre auch nicht mehr Tipparbeit, als alle Member bei Camp zu registrieren.
Kurz gesagt: Ich suche eine möglichst schöne Lösung, für etwas, dass mit C++ eigentlich gar nicht geht. Eine Lösung die es mir erspart wirklich viele sehr kurze und primitive Funktionen immer wieder selbst zu tippen.
Das System ist soweit ganz hübsch und funktioniert auch gut, man ist auch direkt wahnsinnig flexibel und alles, nur jetzt wird es sehr hässlich, wenn ich das ganze Laden und Speichern will.
Ich würde zum speichern eines Objektes alle Member durchgehen und speichern, einfache (ints) schreibt man direkt komplexere (andere Objekte) haben jeweils eine eigene Speicherfunktion.
Allerdings bekomme ich dadurch natürlich einen riesigen Overhead, eine LaufAktion speichert ja letztendlich nur ein Ziel und die Laufgeschwindigkeit. Wenn ich ja jetzt lade und Speicherfunktionen für schreibe, ist die Klasse direkt doppelt so groß. Noch schlimmer wird es, wenn ich für den Leveleditor alle Parameter aller Objekte ändern können will und dafür GUI Elemente erstellen muss.
Die einzelnen Funktionen sind dann natürlich alle sehr ähnlich, und es ist ermüdend, die immer tippen zu müssen.
Darum versuche ich jetzt irgendwas in Richtung Reflection zu machen. Leider kann C++ das nicht. Und ich habe bisher keine Lösung gefunden, die nicht irgendwie äußerst hässlich wäre.
Hinzu kommt, dass zum Beispiel das laden an sich gar nicht so einfach ist. Wenn man einen Pointer auf ein anderes Entity speichern will, würde man das ja wahrscheinlich durch eine ID ersetzen die man beim Laden wieder durch einen Pointer ersetzen muss, was erst geht, wenn man alle anderen geladen hat.
Ich hab jetzt hin und her überlegt, wie ich das ganze am schönsten machen kann. Man könnte versuchen, alle Klassen von einer Reflectable Klasse erben zu lassen, die Pointer auf alle Member speichert und die man in jedem Konstruktor dann entsprechend befüllt. Funktioniert wohl, aber man speichert dann alles für jedes Objekt, wobei alle Objekte einer Klasse natürlich die selben Member haben.
Wenn man versucht die Infos pro Klasse zu speichern hat man so Probleme wie das Adressen relativ zum this Zeiger nicht mehr Stimmen, wenn man Vererbung benutzt.
Dann gibt es da noch sowas wie Camp. Naja, die Dokumentation ist ziemlich mies, und es scheint so als würde man Member per Getter und Setter ansprechen müssen, und sowas mag ich nicht. Und um an die Member direkt ran zu kommen, muss man deren Typ kennen, der dann nur per enum gespeichert wird und dann muss man wieder switchblöcke machen und so. Insgesamt kann ich noch nicht sehen, was dadran jetzt schöner ist, als an einer selbst programmierten frickel Lösung, und zusätzliche Bibliotheken sind ja erstmal immer schlecht.
Es muss ja vielleicht auch gar kein Reflektion sein, vielleicht findet man ja eine schöne Lösung, wie man zumindest das Laden/Speichern/Editor GUI ELement erstellen und "Methoden bei Skriptsprache registrieren" einfacher und kürzer hinbekommt. Jede Klasse könnte eine Methode haben, die alle Member durchgeht und dafür ein ihr übergebenes Funktionsobjekt aufruft, was man dann passend für den jeweiligen Zweck übergeben könnte, oder so. Wäre auch nicht mehr Tipparbeit, als alle Member bei Camp zu registrieren.
Kurz gesagt: Ich suche eine möglichst schöne Lösung, für etwas, dass mit C++ eigentlich gar nicht geht. Eine Lösung die es mir erspart wirklich viele sehr kurze und primitive Funktionen immer wieder selbst zu tippen.