Hallo, zur Zeit entwickle ich ein binäres Dateiformat das ich für Leveldateien meines Spiels benutzen möchte. Das schreiben in die Dateien habe ich bereits implementiert aber beim Lesen sind bei mir einige "Design-spezifische" Fragen aufgetreten. Und zwar:
(erst einige Hintergrundinformationen: )
Die Informationen in einer Datei meines Formats sind folgendermaßen geordnet:
[ein byte mit eindeutiger ID der Struktur/Klasse][Informationen die von der neu erstellten Instanz der Struktur/Klasse gelesen werden sollen (viele bytes)]
D.h. wenn z.B. eine ID mit dem wert 16 gelesen wird (welche dem Typ "Tree" zugeordnet ist) soll eine Instanz vom Typ "Tree" erstellt werden. Diese ruft dann eine, von der Basisklasse aller Spielobjekte geerbte, virtuelle, Memberfunktion "__read(FILE* f)" die dann selbstständig alle benötigten Informationen ausliest.
Ich bin mir aber etwas unsicher wie ich die Erkennung des benötigten Typs anhand der ID implementieren soll. Die aller primitivste Variante die mir einfällt ist die Benutzung des Switch-Case Konstruktes, d.h.
|
C-/C++-Quelltext
|
1
2
3
|
GameObject* gobj;
switch (ID){ case 0: gobj = Instantiate(f); break;
case 1: gobj = Instantiate(f); break; /* Und so weiter... */}
|
Allerdings finde ich diese Vorgehensweise etwas "unelegant". Was ich mir noch überlegt habe ist die Erstellung einer "Instantiator" Klasse für jeden Typ. Dann wird jew. 1 Instanz von jedem Instantiator-Typ in einen Map Container (mit einem uint8_t als Key) eingefügt. Dann könnte man nach dem Einlesen der ID mit der selbigen die oben erwähnte STL-Map indexieren. Also ungefähr so:
|
C-/C++-Quelltext
|
1
2
3
|
GameObject* gobj;
gobj = Instantiators[ID]->Instantiate(f);
|
Doch ich frage mich jetzt ob das nicht leicht "overdesigned" ist.
Und nun wollte ich Fragen welche der beiden Methoden eurer Meinung nach besser ist. Und wenn es andere Alternativen gibt, spricht selbstverständlich nichts dagegen diese hier zu äußern
![:D](wcf/images/smilies/biggrin.png.pagespeed.ce.UPFXer8Yu2.png)
.
Vielen Dank im Voraus!
mfg
Alex