Welche C ++ - GUI-Bibliothek können Sie vorschlagen? [geschlossen]


26

Ich baue meine eigene Spiel-Engine in C ++ und entscheide derzeit, welche Benutzeroberfläche ich verwenden soll.

Soll ich eine Bibliothek benutzen? Soll ich mein eigenes machen?


3
Es ist nicht klar, was du meinst: In-Game-GUI? Oder GUI für Tools? Jeder ist eine ganz andere Anforderung ..
Jacmoe

1
Wer braucht Werkzeuge, wenn Sie eine ENGINE (epische Musik) haben
Ricket

1
Wenn Sie nur modale Dialoge benötigen, sind winzige Dateidialoge in sourceforge eine einzelne plattformübergreifende C C ++ - Datei, die Sie Ihrem Projekt hinzufügen können. no init, no main loop
tinyfiledialogs

Antworten:


11

Tatsächlich können Qt-Widgets in OpenGL und OpenGL einfach in Qt (QGLWidget) integriert werden. Natürlich sind die Widgets, die auf der Plattform nativ aussehen, möglicherweise nicht genau das, wonach Sie suchen, aber keine Sorge, es gibt Möglichkeiten, sie anzupassen, eigene Widgets zu erstellen oder etwas anderes zu verwenden, das Ihren Anforderungen besser entspricht, wie z. B. Qt Quick (which Sie sollten auch integrieren können).

Wenn Sie interessiert sind, sollten Sie diese Links nicht verpassen: Widgets betreten die dritte Dimension: WolfenQt und Beschleunigen Sie Ihre Widgets mit OpenGL


9

Ich denke nicht, dass Sie Ihre eigene schreiben sollten, die Aufgabe, eine Spiel-Engine zu erstellen, ist für sich allein so groß, wenn Sie viele, viele Bibliotheken mit guten Lizenzen haben, die Sie verwenden und nach Ihren Wünschen modifizieren können.

Für eine Game-Engine würde ich eine grafische Benutzeroberfläche im Sofortmodus wählen. Weitere Informationen finden Sie hier: http://www.mollyrocket.com/forums/viewtopic.php?t=134

Die Schlüsselidee ist, die Komponente zu zeichnen und gleichzeitig die Interaktion zu steuern:

if (button(id, position, size)) 
{
    button_was_pressed();
}

Zum einen verwendet Unity ein ähnliches Konzept.

Eine Implementierung von NVIDIA finden Sie in den Demos: http://code.google.com/p/nvidia-widgets/


4
IM GUI ist ein interessantes Konzept, aber ich habe festgestellt, dass es einige Probleme gibt, die auftauchen, wenn Sie versuchen, spielerische Dinge zu tun. Wenn Sie möchten, dass die Menüelemente animiert werden, müssen Sie entweder die individuelle Position aller Widgets ändern oder die GUI-Transformationsmatrix für diesen Aufruf ändern. Es wäre einfacher, wenn Sie beispielsweise einen Window-Container hätten, dessen Aktionen auf seine untergeordneten Objekte und dergleichen übersetzt werden. Aus irgendeinem Grund fehlen den meisten IMGUI-Implementierungen auch "deaktivierte" Widget-Zustände.
Tetrad

@Tetrad: Es ist sehr einfach, Widget-Gruppen mit automatischen Layouts, relativen Positionen oder absoluten Positionen zu implementieren (Nvidia-Widgets tun dies.) Sie können Widgets auf einfache Weise in Fenstern oder Bedienfeldern einfügen. Für den Zustand "Behinderte" kann ich nicht erkennen, warum dies nicht trivial umgesetzt werden würde. Für "gamey things" sind die Konzepte des unmittelbaren Modus meines Erachtens besser geeignet als der beibehaltene Modus, da die Widgets bei jedem Frame aktualisiert werden.
Oskar N.

7

Persönlich würde ich CEGUI empfehlen . Es ist Open Source und ziemlich gut. Was Sie jedoch beachten müssen, ist, dass es sehr, sehr ausführlich sein kann, wenn Sie alles mit der Hand aufschreiben.

Positiv zu vermerken ist, dass es Renderer für OpenGL und DirectX gibt. Ich habe es geschafft, es auf das Template zu setzen, das ich normalerweise benutze, das direkt mit einem VBO in eine Textur schreibt (es ist irgendwie hacky).

Das fragliche Spiel war für eine Netzwerkaufgabe. Die Aufgabe bestand darin, ein vernetztes Spiel mit einer Lobby zu haben. Ich wusste, dass die Lobby schmerzhaft für mich sein würde, also suchte ich mir eine Bibliothek aus, die das meiste für mich erledigte.


Dies ist, was ich derzeit benutze. Ich finde, dass es zu viel Abhängigkeit hat. Und ich hatte Probleme, es mit meinem Projekt zu verknüpfen (IIRC, die Lizenz besagt, dass ich nur mit der Bibliothek verknüpfen kann)
MrValdez

6
Es gibt eine Menge lächerlicher Abhängigkeiten. Es hat mein kleines Demo-Spiel auf 50 MB aufgebläht!
Ritter666

Was? Ich denke, Sie machen es falsch :) Das Gewicht der CEGUI-DLLs in meinem Spiel beträgt weniger als 3 MB. Und zu MrValdez: CEGUI ist unter der BSD-Lizenz ..
jacmoe

MIT-Lizenz - Entschuldigung. CEGUI steht unter der MIT-Lizenz. :)
jacmoe

5

Das Problem mit den meisten GUI-Bibliotheken (Qt ist wahrscheinlich die beliebteste C ++ - Bibliothek, die nicht nur für Windows geeignet ist) ist, dass sich die meisten nicht gut in eine Engine integrieren lassen. Traditionell in einer GUI-App steuert die GUI-Bibliothek die Hauptschleife, und Sie schließen einfach Rückrufe an Ereignisse an. In einer Game-Engine möchten Sie in der Regel die Schleife steuern, daher kann dies bestenfalls schwierig sein. Vielleicht suchen Sie etwas, das sich nur mit Zeichnungssteuerelementen und Dialogen befasst und in einen 3D-Kontext überführt, den Sie übergeben? Diese können viel schwieriger zu finden sein: - /


<pedantic> wxWidgets ist auch plattformübergreifend </ pedantic>, obwohl ich Ihren Standpunkt zur
Motorintegration verstehe

3
Ich sagte "am beliebtesten", nicht "nur": - P wx unterstützt die Arbeit mit 3D-Kontexten noch weniger, als ich zuletzt gesehen habe.
Coderanger

4

Ich glaube fest daran, deine eigenen zu schreiben, aber andererseits bin ich sehr oldskool. Das Kämpfen mit einer anderen GUI-Bibliothek, um genau das zu tun, was Sie wollen, macht mich verrückt. Hinzu kommt, dass die meisten Spiel-GUIs ziemlich trivial sind, sodass Sie nicht auf MDI und Super-OO-Design verzichten müssen Schaltflächen können Bildlaufansichten enthalten, die hervorgehoben werden, wenn Sie mit ziehbaren Daumen über eine Taskleiste an der Seite eines Kontrollkästchens fahren - oder so ähnlich. Ich denke, verschiedene Schläge für verschiedene Leute.


Es gibt Situationen, in denen "Schreiben Sie Ihre eigenen" nicht so fehl am Platz ist, wie man denkt. Ein Spiel, bei dem die Benutzeroberfläche wichtig ist, z. B. bei Managementspielen oder RPGs mit komplexen Gegenstandsverwaltungen. Die Benutzeroberfläche würde einen großen Teil der Erfahrung ausmachen. joelonsoftware.com/articles/fog0000000007.html Wenn es ein Kerngeschäft Funktion ist - do it yourself, egal was passiert
v.oddou

3

Eine Option, die es möglicherweise wert ist, untersucht zu werden, ist die Verwendung von WebKit zum Rendern Ihrer Benutzeroberflächen und die Ausführung Ihrer gesamten Benutzeroberfläche mit CSS / HTML / Javascript.

Hier ist eine Open-Source-Implementierung (Berkelium) , und hier ist eine kommerzielle Implementierung (Awesomium).


5
WebKit und seine Verwandten sind eher auf eine Aktualisierungsrate von ein bis zwei Sekunden ausgerichtet. Es könnte schwierig sein, auf diese Weise ein HUD für ein aktionsorientiertes Spiel zu erstellen. Wäre toll für Menüs oder langsamere Bits.
Coderanger

1
@coderanger: Sie können ganze Spiele in JavaScript / HTML5 schreiben. Ich habe ein kommerzielles Actionspiel für den Chrome Web Store veröffentlicht, das in WebKit / Chrome mit 60 FPS funktioniert.
Sean Middleditch

3

Ich würde IUP - Portable User Interface vorschlagen: http://www.tecgraf.puc-rio.br/iup/

Ich habe es nur mit der Programmiersprache Lua verwendet, aber es war sehr einfach zu bedienen. Es gibt es nur in den Geschmacksrichtungen C, LED und Lua, aber Sie können leicht eine Verpackung dafür erstellen.


Sieht interessant aus. Ich werde es überprüfen, sobald ich kann.
MrValdez

3

Ich persönlich benutze CEGUI in meinem Spielprojekt und es ist eine ziemlich robuste Lösung. Das Problem ist, manchmal fühlt es sich fast so an, als würde man eine kleine Änderung an den sich verändernden Tonnen von Dateien vornehmen.

Ich habe es nicht benutzt, aber libRocket ist komplett kostenlos, ohne Lizenzgebühren und was nicht. Das Coole an dieser Bibliothek ist, dass Sie sie in HTML / CSS-Syntax schreiben. http://librocket.com


2

Verwenden Sie die Win32-API, wenn Sie das Spiel für Windows entwickeln möchten. Verwenden Sie einfach die normalen Windows-Steuerelemente (ich würde die Verwendung der ATL / WTL-Bibliotheken empfehlen), aber machen Sie sie Besitzer gezeichnet.

Ich habe gesehen, wie diese Technik im ersten Unreal Tournament-Spiel verwendet wurde, als ich die öffentlich veröffentlichten Header (für Mod-Hersteller) durchgesehen habe.

Einer der Hauptvorteile dabei ist, dass Sie die gesamte Windows-UI-Infrastruktur zur Verfügung haben und die Einstellungen des Benutzers für Tastaturwiederholrate, Mausempfindlichkeit, Doppelklickgeschwindigkeit und andere Dinge beibehalten. Auch wenn Sie die Regeln einhalten, ist die Benutzeroberfläche schnell und flackerfrei.

Die Nachteile sind, dass Sie noch Code schreiben müssen, um die Windows-Steuerelemente in Unterklassen zu unterteilen, damit sie vom Eigentümer gezeichnet werden, damit Sie Ihre eigenen Grafiken und Effekte auf sie anwenden können.

Einfach als Idee rausschmeißen.


1
Ich glaube, Win32 / COM ist auf Vista und Win 7 emuliert. Nicht für hohe Leistung empfohlen ...
Stephen Furlani

Ich denke, es hängt davon ab, wie viel von der GUI Sie im Spiel verwenden werden. Wenn es nur um das Menüsystem geht, wen interessiert es dann wirklich, wenn Sie es ausgiebig in dem für die Framerate entscheidenden Abschnitt verwenden, dann ist einiges an Arbeit und Nachdenken erforderlich.
Daemin

@StephenFurlani Win32 / COM ist unter Vista und Windows 7 nicht emuliert, sondern nativ und mit voller Geschwindigkeit. Außerdem ist ATL / WTL nicht auf COM angewiesen, sondern auf DirectX.
Daemin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.