Sto costruendo il mio motore di gioco in C ++ e attualmente sto decidendo quale interfaccia utente dovrei usare.
Dovrei usare una biblioteca? Devo crearne uno mio?
Sto costruendo il mio motore di gioco in C ++ e attualmente sto decidendo quale interfaccia utente dovrei usare.
Dovrei usare una biblioteca? Devo crearne uno mio?
Risposte:
In effetti, i widget Qt possono essere integrati con OpenGL e OpenGL può essere facilmente integrato con Qt (QGLWidget). Naturalmente, i widget dall'aspetto nativo della piattaforma potrebbero non essere esattamente quello che stai cercando, ma non preoccuparti, ci sono modi per personalizzarli, crearne uno tuo o utilizzare qualcos'altro che si adatti meglio alle tue esigenze, come Qt Quick (che dovresti essere in grado di integrare anche).
Se sei interessato, non perdere questi link: i widget entrano nella terza dimensione: WolfenQt e accelera i tuoi widget con OpenGL
Non credo che dovresti scrivere il tuo, il compito di creare un motore di gioco è così grande da solo, se ci sono molte librerie con buone licenze che potresti usare e modificare a tuo piacimento.
Per un motore di gioco sceglierei una GUI in modalità Immediata. Maggiori informazioni qui: http://www.mollyrocket.com/forums/viewtopic.php?t=134
L'idea chiave è quella di disegnare il componente e controllare l'interazione allo stesso tempo:
if (button(id, position, size))
{
button_was_pressed();
}
Per prima cosa, Unity utilizza un concetto simile.
Puoi trovare un'implementazione di NVIDIA, utilizzata nelle loro demo: http://code.google.com/p/nvidia-widgets/
Personalmente, consiglierei CEGUI . È open source e abbastanza buono. Tuttavia, ciò che devi tenere a mente è che può essere molto, molto dettagliato se scrivi tutto a mano.
Ma, dal lato positivo, ha renderer sia per OpenGL che per DirectX. Sono riuscito a metterlo in cima al modello che uso normalmente, che scrive direttamente su una trama usando un VBO (è una specie di hacky).
Il gioco in questione era per un incarico di rete. Il compito era di avere un gioco in rete, con una lobby. Sapevo che l'atrio sarebbe stato un dolore al collo da fare, quindi ho scelto una biblioteca che faceva la maggior parte per me.
Il problema con la maggior parte delle librerie GUI (Qt è probabilmente il C ++ più popolare che non è solo Windows) è che la maggior parte non si integra bene in un motore. Tradizionalmente in un'app GUI, la libreria GUI controlla il ciclo principale e si collegano solo i callback agli eventi. In un motore di gioco generalmente vuoi controllare il loop, quindi nella migliore delle ipotesi può essere complicato. Forse stai cercando qualcosa che gestirà solo i controlli di disegno e le finestre di dialogo e che in un contesto 3D lo passi? Quelli possono essere molto più difficili da trovare: - /
Credo fermamente nel scrivere il tuo ma poi di nuovo sono molto vecchio. Combattere con l'ennesima lib GUI per fare proprio quella cosa che vuoi tende a farmi impazzire, aggiunto al fatto che la maggior parte delle GUI di gioco sono abbastanza banali, quindi non devi andare tutto su MDI e design super OO in cui i pulsanti possono avere visualizzazioni di scorrimento che si evidenziano quando si passa sopra una barra delle applicazioni sul lato di una casella di controllo con i pollici trascinabili o qualcosa del genere. Colpi diversi per persone diverse credo.
Un'opzione che potrebbe valere la pena investigare è l'utilizzo di WebKit per il rendering delle interfacce utente e l'esecuzione dell'intera interfaccia utente con CSS / HTML / Javascript.
Ecco un'implementazione open source (Berkelium) , ed ecco un'implementazione commerciale chiusa (Awesomium)
Suggerirei IUP - Portable User Interface: http://www.tecgraf.puc-rio.br/iup/
L'ho usato solo con il linguaggio di programmazione Lua ma era molto facile da usare. È disponibile solo nei gusti C, LED e Lua ma puoi facilmente creare un involucro per questo.
Personalmente sto usando CEGUI nel mio progetto di gioco, ed è una soluzione abbastanza solida. Il problema è che a volte sembra quasi di fare una piccola modifica alterando tonnellate di file.
Non l'ho usato, ma libRocket è diventato completamente gratuito, rimuovendo tutti i costi di licenza e cosa no. La parte interessante di questa lib è che la scrivi nella sintassi html / css. http://librocket.com
Basta sollevare un suggerimento interessante, se si sviluppa il gioco per Windows, utilizzare l'API Win32. Basta usare i normali controlli di Windows (consiglierei di usare le librerie ATL / WTL) ma renderli disegnati dal proprietario.
Ho visto questa tecnica essere utilizzata nel primo gioco Unreal Tournament, mentre guardavo le intestazioni pubblicamente rilasciate (per i produttori di mod).
Uno dei vantaggi principali di questo è avere l'intera infrastruttura dell'interfaccia utente di Windows a disposizione, oltre a mantenere le preferenze dell'utente per la frequenza di ripetizione della tastiera, la sensibilità del mouse, la velocità del doppio clic e altre cose. Inoltre, se obbedisci alle regole, l'interfaccia sarà veloce e senza sfarfallio.
Gli svantaggi sono che dovrai comunque scrivere del codice per sottoclassare i controlli di Windows per farli disegnare dal proprietario in modo da poter applicare la tua grafica ed effetti a loro.
Basta buttarlo fuori come idea.