E
Hoi!
Vielleicht kennt jemand die Irrlicht-Engine, eine wirklich tolle API mit sehr vielen Funktionen und auch schnell. Als Nachteil muss ich aufführen dass das Design fürchterlich ist, lauter Gottklassen mit 100 Membern und mehr, der totale Verzicht auf die Standardbibliothek, nur minimaler Einsatz von Templates und selbst die besser designten Teile sehen nach recht altem C++ aus.
Genauso ist es beim GUI-Teil der Bibliothek, um beispielsweise einen Button im GUI zu zeichen muss man folgendes tun:
1. Definiert man irgendwo eine ID für den Button.
2. Nun ruft man die Klassenfunktion
IGUIButton* IGuiEvironment::addButton (const core::rect< s32 > &rectangle, IGUIElement *parent=0, s32 id=-1, const wchar_t *text=0, const wchar_t *tooltiptext=0)
auf.
3. Jetzt geht man in seine eigene "Message Loop" Funktion, eine Funktion in der man auf Events reagiert, und prüft erstmal ab ob ein Event ein Gui-Event ist, ob es für die ID des Buttons ausgelöst wurde und welches Event es war, bevor man darauf reagieren kann. Natürlich ist in dem MessageLoop auch die ganze restliche Event-Verwaltung, dh. ich muss für mein Spiel hier auch auf Maus- und Tastaturaktionen reagieren ...
Mein Ansatz das zu lösen macht es zwar erstmal leichter, klingt mir aber auch nicht nach dem besten Design:
1. Ich schreibe eine Klasse gui_manager, die als Factory für GUI-Objekte dient.
2. IDs werden von dieser Klasse selbst erzeugt und Objekte werden in eine unordered_map (=Hashtable) mit der ID als Key abgelegt. Zusätzlich sind GUI-Objekte ab jetzt über einen Namen abrufbar. Außerdem hat jedes Gui-Element, das in der Hashtable gespeichert wird, eine eigene Hashtable mit den verschiedenen GUI-Events als Key und einem Callback als Value.
3. Es gibt eine Funktion gui_manager::handle(event::event const&), die ein GUI-Event entgegennimmt, sich aus der Hashtable per ID das passende GUI-Objekt herraussucht und sich aus dessen Hashtable mit dem Eventtyp den passenden Callback heraussucht und aufruft.
Klingt vermutlich wirr, aber so ist mein Plan.
Hat jemand bessere Vorschläge/Kritik?
Und ...
Ist eine std::unordered_map bei max ~50 Elementen (Soviel hat ein GUI im Spiel ja ungefähr) nicht einem std::vector unterlegen, in der Annahme dass die unordered_map öfters auch normal iteriert werden muss? (nämlich wenn nach einem Namen gesucht wird?)
Danke und Grüße,
Ethon