GUI-Engine in 3D-Engine
-
Also, mein Designansatz ist ÄUSSERST primitiv!
Ich hab ein paar Basisklassen, wie z.B. Auswahlfelder, Text-Buttons, CheckBoxes etc.
Die kannst du per LUA hinzufügen. ein tut zu LUA findest du unter http://www.gamedev.net/reference/programming/features/lua/ .
Die Menüs kannst du dann hinzufügen wenn du ein Script machst.
Z.B.:AddMenu("MenuBMP","MenuName"); AddButton("CheckBox","CheckBox1",FUNKTION,POSX,POSY);
Das coole bei LUA, du kannst auch funktionen übergeben! Allerdings muss die funktion die Form int myfunc(lua_state *x) haben.
So hab ich das gemacht!
Aber wie gesagt funktioniert noch net ganz, aber ich denke das ist der beste Weg zwischen Hard-Coded-Menus und der ganz extremen Kapselung.
Und das beste, wenn du noch SDL benutzt wird das Game absolut plattformunabhängig!/edit
Hier noch ein älterer Link zum Thema GUI's http://www.gamedev.net/reference/programming/features/gui[ Dieser Beitrag wurde am 09.06.2003 um 13:07 Uhr von stealth00 editiert. ]
-
Ja, LUA kenn ich und verwend es auch schon (dass es noch nicht 100%ig funzt, ist ein anderes Thema
).
Die Frage ist nur, wie implementierst du bei deinen System verschiedene APIs, z.B. die Windows API und eine DirectX GUI, wie in deinem Tutorial beschrieben?
Wird da einfach von den Basisklassen abgeleitet, weil du bei deinem AddMenu() nirgends die Basisklasse angibst!
ChrisM
-
Hmm...
Sry, ich weiss nicht genau wo du hinauswillst. Meine Editoren schreib ich in MSVC++ mit dem MFC. Dazu ist es am besten. Da haben Linux user leider pech gehabt. Allerdings Ingame, benutze ich vordefinierte Klasse. Die sind dann unter einer ID gespeichert, und werden nur noch mit den wichtigen Daten versorgt.
Sobald sie aktiviert sind kümmert sich der Menümanger um sie, bearbeitet OnClick befehle etc!
-
Ich glaub, ich erläutere meine Engine mal etwas genauer. Meine Engine soll unter Windows und Linux laufen. Die Engine ist plugin-basiert, unter Windows werden die Plugins als DLLs programmiert und Linux als SOs.
Verschiedene Plugins werden nun so implementiert, dass der Enginekernel verschiedene Manager enthält, z.B. einen Filesystem-Manager. Der kann jetzt verschiedene von FileSystem abgeleitete Klassen aus Plugins speichern (bzw. Factoryinstanzen, die diese Klassen erzeugen können). So kann ich z.B. je nach geladenen Plugins für den Nutzer transparent aus ZIP-Dateien wie aus normalen Verzeichnissen lesen, es muss halt nur das ZIP-Plugin geladen sein.Jetzt frage ich mich, ob ich auch ein komplettes GUI-System einbauen soll, für das es dann verschiedene Plugins wie Windows API-Kapselung oder z.B. Ingame GUI mit DirectX geben wird (ist aber alles sehr viel Aufwand).
Und wenn ich das mache, frage ich mich, wie ich das am besten machen soll, also z.B. Interfaces für Fenster, Button usw., die das Plugin alle implementieren muss oder wie sonst?ChrisM
-
Warum nicht ! Das Grundgerüst dafür (der Manager) ist garnicht mal so schwierig. Ein paar Functors für die Events, ne Baumartige Struktur für SubWindows und das wars eigentlich auch schon ... Schwierig ist eigentlich nur die Implementierung der DLL wo man das ganze zeuch dann zeichnen muss ! (z.B. mit einer GrafikApi)
-
Was ist ein Functor? Oft gehört, nie kapiert...
Naja, mit der Windows API stell ich mir das gar nicht so schwer vor, ich muss halt nur aufpassen, dass sich z.B. mehrere Fenster nicht in die Quere kommen wegen statischer Callbackfunktion. (mit SetWindowLong() ID im Fenster speichern)
ChrisM
-
Original erstellt von ChrisM:
Was ist ein Functor? Oft gehört, nie kapiert...A functor is a function that can be manipulated as an object.
In Java, functors are typically implemented as interfaces defined by a single, generic member function, and that is the approach taken here.
Functors support and encourage a number of powerful programming techniques including:
programming in a functional style
higher order functions
internal iterators
reuse and specialization through composition rather than inheritance and overloading
generic "callback" or "extension point" APIs
generic "filters" or predicate APIs
many "behavioral" design patterns, such as Visitor, Strategy, Chain of Responsibility, etc.
See the examples for more information on some of these techniques.
-
Nur um es etwas klarer darzustellen
Ein Functor ist sowas wie ein FunktionsPointer (oder halt Callback) allerdings funktioniert er für Methoden/Funktionen/Statische Methode/den "op()"/ etc... mit allen Möglichen Parametern und Rückgabewerten. (alles templated)
Alles was also ge"called" werden kann.Ausserdem kann ein Functor kopiert werden, was sehr praktisch ist bei manchen gegebenheiten. Die Funktors aus der Loki-lib können sogar Parameter binden, das heist man kann einen dynamischen Parameter fest an den Functor binden und diesen Functor dann ohne diesen Parameter später aufrufen. Der Parameter wird dann automatisch beim Aufruf verwendet. Loki liefert auch noch die Queue Möglichkeit, also mehrere Funktors auf einen zu mappen. Beim Call von Functor1 werden also Functor2 und 3 aufgerufen oder so...
Sehr sehr praktisch, dann hast du auch kein Problem mit deinen statischen CallBack Methoden!!!
-
Erstmal danke für eure Infos!
Also um das nochmal zusammenzufassen:
Wenn ich z.B. einen Button in einem Fenster erstelle, gebe ich bei der Erstellung einen Functor an, der auf alle möglichen Funktionen zeigen kann. Wenn jetzt die Nachrichtenschleife des übergeordneten Fensters einen Klick auf den Button feststellt (in der Fensterklasse müssen natürlich alle Childs wie z.B. der Button gespeichert werden), wird automatisch in der Buttoninstanz nachgeschaut, worauf der Functor zeigt und diese Funktion mit den richtigen Parametern (also z.B. Event = Klick, Time = ...) aufgerufen.Stimmt das so?
Falls jemand noch ein Beispiel wegen den Functors hat, wär ich ihm sehr dankbar, wenn er es hier posten könnte, weil ich ehrlich gesagt net ganz weiß, wie ich einen Functor mit Templates implementieren könnte...
ChrisM
-
*push*
ChrisM