Multiton? (Singleton Variante)
-
Ich verstehe das nicht. Wozu brauchst du ne andere Instanz der Engine um das Menü zu zeichnen?
-
verstehe das auch nicht so ganz (sinn)
meinst du sowas?class Engine : public Singleton { public: Menu *GetMenu() { return menu; } private: Menu menu; }; int main() { Engine engine; Menu *p = engine.GetMenu(); }ziemlich einfaches beispiel aber somit könntest du auch gewährleisten das es nur ein menü existiert
-
nicht viel.
Argumente?
Wozu brauchst du ne andere Instanz der Engine um das Menü zu zeichnen?
Dadurch könnte das Hauptmenü während des Spiels im Speicher bleiben und ich kann während das Spiel läuft (bzw. noch im Speicher ist) im Hauptmenü sein. Ich kann also ohne nachladen umschalten. Besonders wichtig ist das wenn z.B. ein Strategiespiel an verschiedenen Schauplätzen (z.B. Planeten) stattfindet. Man könnte also ohne laden hin- und herschalten. (ggf. ein paar Sachen nachladen wenn der Speicher nicht reicht, aber zumindest ohne alles komplett neu zu initialisieren)
Coolcat
-
@miller_m:
Ja ginge auch, aber dann müsste ich das in der Grafikengine hardcoden. Die Grafikengine soll aber möglichst universell sein. Daher diese Konstanten.
Intern ist das dann einfach ein statischer Vektor, eine Map o.ä....Coolcat
-
machs doch ganz normal wie es jeder machen würde
-
wäre dann eine art factory?!?!? die halt nur eine instanz rausrückt
-
wie es jeder machen würde
Und wie würde es jeder machen?

-
Also eine Factory ist was anderes....
...aber ich merke schon an eueren Reaktionen, dass meine Idee wohl ziemlicher Müll sein muss
Ich denke ich werd es dann auf die konventionelle Art machen.
-
Coolcat schrieb:
Also eine Factory ist was anderes....
wieso du brauchst halt eine basisklasse.
halten könntest du zb: in einer map<enum, basisklasse*> bei einem zugriff wird das objekt erstellt und zurückgegeben falls schon eine instanz vorhanden ist wird diese zurückgegeben. bin ich jetzt so annährend richtig was du dir vorstellst?
du könntest mir allerdings noch dein universell erklären.
-
@miller_m:
Also ja du bist nah dran...
Thx das du dir mühe gibst mich zu verstehen... 
Ich verstehe ich dich jetzt so, das du ein extra Menu und ein Game von Engine ableitest.
Also da alle Instanzen (also für GAME, MENU, usw.) identisch sind brauch ich ja nicht von einer Basisklasse "Engine" ableiten.
Mit universell meine ich eben genau dies. Also die Klasse ist so universell, dass man damit sowohl das Spiel selbst als auch das Menü machen kann.Es wäre dann eine Factory, die nur Objekte vom Typ Engine erzeugt. (was dann keine Factory in dem Sinne mehr ist, vorallem, weil die Factory in die Klasse Engine eingebaut wäre)
Coolcat
-
Coolcat schrieb:
Ich verstehe ich dich jetzt so, das du ein extra Menu und ein Game von Engine ableitest.
irgendwie so etwas, sprich von einer schnittstelle die vernünftig ist. blos nicht von engine halt.
class EngineObj; // virtuelle basisklasse class Menu : public EngineObj; // usw class Engine { map<enum, EngineObj*> objlst; public: EngineObj *get(enum) { } };Coolcat schrieb:
Also da alle Instanzen (also für GAME, MENU, usw.) identisch sind brauch ich ja nicht von einer Basisklasse "Engine" ableiten.
aber könntest du sie in einem container speichern.
game hat nichts mit der engine zu tun. zwischen game und engine sollte eine klare trennung sein.[edit]
tags
-
game hat nichts mit der engine zu tun.
Hä?

Warum kann GAME (bzw. genauso MENU) nicht einfach eine Instanz von Engine sein die für das Spiel zuständig ist?Ich meine das ungefähr so:
class Multiton { public: Multiton& getMultiton(int typ) { Multiton* mt = mtMap[typ]; if (mt) { return *mt; } mt = new Multiton(); mtMap[typ] = mt; return *mt; } private: static map<int,Multiton*> mtMap; //! Konstruktor Multiton() { } //! Destruktor ~Multiton() { } //! alles freigeben, was in mtMap ist... static void destruct() { /*...*/ } };Edit: ^^ Tippfehler im Quellcode

-
Coolcat schrieb:
Warum kann GAME (bzw. genauso MENU) nicht einfach eine Instanz von Engine sein die für das Spiel zuständig ist?
ist vermutlich eine streit frage, aber für ist es so das game die engine als schnittstelle benutzt.
-
ok, mag sein
also ich sag erstmal thx@all, ich werde nochmal etwas über dem Design grübeln....

Coolcat
-
Machs wie alle Engines und implementier nen Szenenmanager, dann kannste im Spiel verschiedene Szenenmanager verwenden je nach Status deines Spiels.
-
und wo genau ist der vorteil von dem hier:
//hier tolle globale enums: [...] getSingleton(GAME); getSingleton(MENU);gegenüber dem hier:
//tolle, globale variablen engine game,menu; [...] game; menu;
ist imho beides nicht so prall.
-
@gueststar:
Saug dir hier (legal) das erste Kapitel von "Game Programming Gems 1"
http://www.edv-buchversand.de/mitp/chapter.php?cnt=chapter&id=itp-0923&lng=
(ca. 600 kb)Und schau dir dann mal Seite 10ff und 32ff an.
Das Buch ist auch sonst sicher interesant...Coolcat