Piero V.

Un po' di riflessione sulle GUI in Ogre

Quando ho un po’ di tempo cerco di portare avanti anche il mio progettino con OGRE, un tentativo di gioco FPS.

Purtroppo il tempo è poco e le decisioni spesso devono essere ponderate molto accuratamente, altrimenti succede quello che mi era già successo con l’altro gioco, ovvero viene fuori un disastro che non si può sistemare perché come si modifica una cosa bisogna sistemarne altre 100.

Perciò vado avanti piano piano ma scegliendo bene come fare tutte le cose.

Un elemento fondamentale di un gioco sono le GUI, almeno quelle che consentono di creare i menu basilari.

Per OGRE ho provato le più diffuse, CEGUI E MyGUI, e Gorilla.

Le prime due li ho provati appena avevo cominciato con OGRE, perciò l’opinione può essere considerata fino solo ad un certo punto.

CEGUI mi pareva molto complicata e ciò veniva detto anche sul forum di Ogre. Poi mi pare avesse un formato tutto suo un po’ strano.

MyGUI è molto più semplice. Il progetto fornisce anche degli strumenti che permettono di costruire graficamente la GUI. Il formato utilizzato è XML e mi pare abbastanza semplice. Il problema maggiore sono gli eventi: sono potenti, però devono essere implementati in C++, perciò i vantaggi dell’XML vengono meno. In seguito tornerò sul problema.

Dopo queste prove ero passato ad Irrlicht che mi pareva più leggero e semplice di Ogre, così avevo un po’ abbandonato il tutto. Dopo però sono tornato ad Ogre. Ho ricominciato da capo tutto e ho trovato Gorilla.

È un buon progetto, molto leggero e basato sull’overlay di Ogre. Le dimostrazioni delle sue applicazioni offrono spunti interessanti, come per esempio il rendering come nodo e su YouTube si possono video simili. Viene offerto anche un file da usare con Luabind e qualche binding di Ogre per Lua (altrimenti c’è addirittura un problema di segmentazione, ne avevo già parlato).

Per un po’ sono andato avanti con questo. Usare Lua per le gui mi pare estremamente indicato perché consente di risparmiare il tempo di compilazione per vedere un singolo cambiamento.

Tuttavia la situazione con Gorilla non è ottimale: il binding in Lua può diventare parecchio lungo. Un’altra cosa che non mi piace è come sono trattati i font: sono PNG perciò ad un certo punto diventano pixellosi. Ma il vero motivo che mi ha portato a cambiare è stato che era fin troppo leggero: non prevedeva neanche i bottoni. Il metodo per auto crearseli, illustrato nei file di esempio, è l’uso dei raggi. Ero arrivato a questo punto, però le cose si sono ulteriormente complicate con le trasformazioni varie, quindi ho detto basta.

Sono tornato a MyGUI e devo dire che ora lo vedo con un a luce diversa.

Con Lua dovrebbe essere più facile modificare anche gli eventi, basta pensare come.

Ho pensato se fare il binding dell’intero motore, ma poi ho visto che è meglio di no: è fortemente basato su alcune caratteristiche di C++, come l’uso dei template.

Bisogna essere razionali quando si fa una cosa del genere. In questo caso secondo me i benefici non sono così tanti, anche perché c’è già il supporto in XML. Il discorso cambia se si parla degli eventi.

Questi secondo me si potrebbe benissimo gestirli in Lua.

Se si analizza un po’ il codice di MyGUI si vede che gli eventi sono la specializzazione di un template che chiama una funzione (vera e propria, membro statico o membro di un oggetto) con parametri standard.

Portare questo template vorrebbe dire riscrivere tutti i template nel binding se va bene e dover anche creare i wrapper, in poche parole.

Un altro metodo secondo me sarebbe quello di creare una classe in C++ che faccia da wrapper a una sua figlia in Lua.

In pratica si mettono lì tutti gli eventi e ognuno ha il suo membro. Poi c’è una funzione che consente di registrare per il widget X l’evento Y, gestita da C++. Così è vero che bisogna fare il wrapper ma questo non dovrebbe essere complicato. È invece abbastanza veloce e lo stesso funzionale e versatile, anche perché Lua permette di cambiare funzioni come variabili, quindi si potrebbe avere anche la singola funzione al posto del membro.

Questa per il momento è la mia idea per il binding in Lua.

Un’altra caratteristica interessante di MyGUI è l’RTT, ovvero Render To Texture, che permetterebbe di fare quello che si faceva con Gorilla, ovvero vedere le gui in un nodo: basta che si utilizzi come materiale la texture di rendering di MyGUI.