Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

21

17.08.2011, 15:03

Ich find Awesomium jetzt nicht so toll. Ich mag HTML eh schon nicht besonders, aber ich glaube, dass es sich für In-Game GUIS ganz besonders nicht eignet.

Nehmen wir mal Crysis:
http://crimild.files.wordpress.com/2011/06/crysis2mw7.jpg

Da hat man schon eine Vielzahl an Elementen, die man bloß in Html schwer hinbekommen dürfte. Oder halt mit so viel Frickelei, dass sich die Vorteile, die HTML und Css haben, nicht mehr lohnen. Dazu kommt, dass das ganze ja scheinbar nicht so wahnsinnig schnell rendert.

Die GUI müsste halt vor allen Dingen sehr sauber strukturiert sein. Und irgendwie das MVC Prinzip richtig gut umsetzen. Ich meine, was nützt es mir, wenn ich die Oberfläche schön mit HTML designen kann, aber nicht schön an das Spiel angebunden kriege?
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

22

17.08.2011, 16:01

Ich finde XML eignet sich zwar prinzipiell schon zur Beschreibung von GUIs, aber HTML halte ich dafür für ungeeignet. HTML ist als Markup für Dokumentstrukturen gedacht. Wenn auch vielleicht vereinzelt Parallelen da sind, so sind das doch zwei Konzepte die sich in ihrer Natur wesentlich unterscheiden.
Man könnte sich auch überlegen XML nur als Beschreibungssprache einzusetzen die dann in ein natives Binärformat kompiliert wird um das Laden der GUI möglichst effizient zu halten.
WPF und XAML können sicherlich als Inspiration dienen. Allerdings lag der Fokus beim Design von WPF wohl schon sehr stark auf RAD. Ich hab zumindest teilweise den Eindruck dass man da vieles hätte sauberer lösen können anstatt überall object-Referenzen herumzureichen...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (17.08.2011, 16:08)


TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

23

18.08.2011, 07:29

WPF und XAML können sicherlich als Inspiration dienen. Allerdings lag der Fokus beim Design von WPF wohl schon sehr stark auf RAD. Ich hab zumindest teilweise den Eindruck dass man da vieles hätte sauberer lösen können anstatt überall object-Referenzen herumzureichen...
also ich erwarte sicher nicht, dass attached und dependency-properties mit DataBinding implementiert werden - armer david. aber grundkonzept des LAYOUTENS finde ich extrem angenehm, meiner meinung nach wurde da sehr gute arbeit geleistet ;) da kann sich zum beispiel java mit seinen layoutern ne scheibe abschneiden.

DarioFrodo

Treue Seele

Beiträge: 349

Wohnort: Kerkau, 100km nördlich von Magdeburg

Beruf: Selbstständig

  • Private Nachricht senden

24

18.08.2011, 07:40

Mir hat eigentlich CEGUI ganz gut gefallen, es ist sehr flexibel was Anpassungen angeht und
was ich am besten finde: man kann das ganze GUI auch mit Lua-Scripten beschreiben. Ebenso die Funktionalität.
Der einzige Nachteil ist die Performance. Wenn CEGUI nur das neu rendern würde, was sich verändert hat und sonst den Rest aus einer dynamischen Textur anzeigen würde, wäre es sicher wesentlich schneller und für mich ideal.
Erst wenn der letzte Fluss vergiftet,
der letzte Baum gefällt,
der letzte Fisch gefangen,
dann werdet ihr merken, dass man Geld nicht essen kann

Man verkauft die Erde nicht, auf der die Menschen wandeln.

- Indianerweisheiten

Ich bin auch ein einhornimmond ;)

25

18.08.2011, 08:41

Ich finde XML eignet sich zwar prinzipiell schon zur Beschreibung von GUIs, aber HTML halte ich dafür für ungeeignet. HTML ist als Markup für Dokumentstrukturen gedacht. Wenn auch vielleicht vereinzelt Parallelen da sind, so sind das doch zwei Konzepte die sich in ihrer Natur wesentlich unterscheiden.


Aber moderne Webseiten hast du in letzter Zeit schon gesehen oder? ;)
Ich würde keine GUI mehr ohne HTML&CSS erstellen wollen. Es ist meiner Meinung nach die beste Möglichkeit eine GUI zu beschreiben und dabei zwischen Elementen und zwischen Styling zu unterscheiden. Außerdem ist HTML universell. Was für mich ein weiterer Punkt wäre, HTML zu nehmen.

@Jonathan_Klein: Die Crysis GUI ist doch kein Beispiel für eine komplexe GUI. Die ist auch in HTML in einigen Tagen machbar. Außerdem rendert HTML sicher schnell genug für alles was du machen magst.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

26

18.08.2011, 12:04

Wenn Du einen Core übrig hast, ist HTML sicher auch ne gute Idee. In Echtzeit stell ich mir das kniffliger vor. Bekommt man die auch sinnvoll transparent mit einem 3D-Hintergrund gemerged?

Ich bin aufgrund verschiedener Umstände auch gerade dabei, eine GUI zu schreiben. Ansprüche waren explizite Wiederverwendbarkeit, z.B. für die Splitterwelten später, und einige grundlegende Komponenten für InGame-GUIs: Text, Button, Checkbox, ComboBox, LineEdit, TabWidget. Ich tippe hier mal kurz einen Erfahrungsbericht:

Der Anfang war viel Tipparbeit. Ich wollte, dass die GUI nicht selbst aktiv wird, also keine Eingaben abfragt oder gar die Hauptschleife übernimmt. Daher wurden ein Rudel Ereignisse definiert, mit denen man die Gui füttern kann. An der Stelle kann man dann auch gleich verschiedene Eingabemedien aufeinander abbilden, wodurch die GUI inzwischen auch per GamePad oder Tastatur bedienbar ist.

Die Basisklasse war sehr schlicht - Position, Größe, virtuelle BehandleEreignis-Funktionen, Zeichen-Funktion. Dazu kommt Fokus und Sichtbarkeit. Zu letzteren habe ich auch immer die Zeitpunkte der letzten Aktivierung und Deaktivierung gespeichert, was der Gui-Renderer dann für Überblend-Effekte nach seinem Geschmack verwenden kann. Das funktioniert richtig gut und es ist sehr erfrischend, sich nicht über x Übergangszustände Gedanken machen zu müssen, weil der GUI-State immer sofort und eindeutig wechselt. Nur die optische Darstellung zieht z.B. über die nächste halbe Sekunde nach. Eine sehr angenehme Arbeitsweise, solange die Übergangsanimationen kurz genug sind, damit der Unterschied zwischen Darstellung und GUI-State nicht die Nutzer verwirrt.

Ich habe hier das erste Mal mit einer Endknoten-Basisklasse experimentiert, wo erst die erste Ableitung Kinder haben kann. Bislang waren alle meine Objekt-Hierarchien immer so ausgelegt, dass jedes Objekt Kinder haben kann. Jetzt gibt es eine spezielle Ableitung, die Kinder haben kann, während die meisten Klassen keine haben können. Das erfordert vereinzelt einen dynamic_cast, ist aber größtenteils eine angenehme Arbeitsweise.

Ich habe frühzeitig automatisches Layout eingebaut - bislang gibt es nur vertikale und horizontale Gruppierungen, in denen wachstumsfähige Objekte Zusatzgröße erhalten und der Rest nach Ausrichtung und Abständen angeordnet wird. In das System habe ich ein paar Stunden Arbeit gesteckt, weil es doch einige hässliche Dynamiken gibt, wenn das Layout bei Hinzufügen, Löschen oder Umgruppieren von Komponenten jedesmal neu berechnet werden muss und man dann einige davon ineinander stapelt. Jetzt klappt es aber prima und ich bin sehr dankbar, mich nicht mit den manuellen Pixel-Schubsereien beschäftigen zu müssen. Anpassung an Auflösungsänderungen kommt da quasi vollautomatisch mit.

Das Rendering steckt komplett in einer externen Klasse, die per Double Dispatch einzelne Komponenten zeichnet. Eine sehr angenehme Herangehensweise, da man mit einer einzelnen Klasse und ein paar Dutzend Zeilen das Aussehen komplett umkrempeln kann. Bei hierarchischen Zeicheneffekten wie z.B. einer ScrollArea, in der die Kinder mit Scrollbalken bewegt und gegen die Vater-Komponente geclippt werden, versagt diese Herangehensweise allerdings. Ich weiß noch nicht, wie ich das lösen werde - vielleicht ein fieser kleiner Spezialhack für diesen einen Fall. Ich bin ja für die Ergebnisse hier und nicht für den OO-Designpreis.

Man definiert übrigens sehr viele Parameter, wenn man eine GUI schreibt (Komponenten-Standardgrößen und -abstände) und vor allem, wenn man den Renderer schreibt (Größen, Farben, Anim-Zeiten). Manche davon, speziell die Animationszeiten, müssen auch noch beiden Seiten - Gui und Renderer - bekannt sein. Ich habe dazu einfach einen boost::property_tree benutzt, den man am Anfang mit einer XML-Konfig füttert und den auch der Renderer mit gängigen Einstellungen füllt. Damit kann man nicht nur entspannt das GUI-Aussehen und -Verhalten konfigurieren, sondern erfreut sich auch an abstrakter Werte-Teilung, ohne das GUI und Renderer plötzlich voneinander wissen müssen.

Die Ereignis-Verteilung war noch ein gewisses Problem. Man muss für alle möglichen Zwecke ermitteln, ob eine Komponente gerade ansprechbar ist oder nicht. Eine Sichtbarkeitsprüfung reicht da nicht, da die optische Verdeckung nur wenig mit der Bedienbarkeit zu tun hat. Es gibt oft Fälle, wo ein kleiner (OK|Abbrechen)-Dialog den Dialog dahinter stilllegt, ihn aber optisch nicht verdeckt. Ich habe das jetzt so gelöst, dass Komponenten als "exklusiv" definiert werden können und dann Nachbarkomponenten auf der selben Hierarchieebene und deren Kinder vom Ereignis-Empfang ausschließen. Das klappt jetzt prima - endlich werden auch Tasten-Shortcuts nicht mehr an Buttons im Hintergrund durchgestellt.

Die Ereignisverteilung an die GUI-Nutzer funktioniert über boost::signal. Mehr ist dazu nicht zu sagen.

Es gab in der Hierarchie noch manche Probleme mit Verweisen auf gelöschte oder entfernte Komponenten, aber das war im Endeffekt nur Inkonsequenz von mir. Es gibt jetzt eine virtuelle SetParent()-Funktion, in der sich beim Löschen Komponenten auch von Vater und der Wurzelkomponente abmelden. Das wird an den paar Stellen, wo es kritisch ist, benutzt, um Verweise aufzuräumen. Man sollte dabei auch an die ganzen Timer denken, die zeitverzögert Komponenten löschen oder erzeugen. Eine schlichte ID beim Erzeugen des Timers funktionierte da gut, das Löschen von Timern anhand der Zielfunktion ist spätestens mit C++0x Lambdas nicht mehr möglich.

Dialoge sind jetzt einfach nur Komponenten, die im Konstruktor sich selbst mit Zeug füllen und deren Signale auf eigene Funktionen umbiegen. Ein durchschnittlicher InGame-Pausedialog mit ein paar Optionen ist in 20 Zeilen gemacht. Sehr angenehm. Man könnte an der Stelle jetzt auch stressfrei Dialog-Erstellung und Handler-Funktionen in Skripte rausziehen, aber das war mir zu mühsam. Der Double Dispatch-Ansatz im Renderer funktioniert natürlich mit solchen außerhalb des GUI-Projekts definierten Komponenten nicht mehr, aber es gibt ja immernoch den klassischen Ansatz des Selber-Renderns oder alternativ ein Verzweigen anhand dynamic_cast in der CatchAll-Funktion des Renderers

Und final noch: ich habe in den letzten Tagen C++0x sehr zu schätzen gelernt. Allen voran die Lambdas, die selten aber effektiv anwendbar sind. auto habe ich direkt ins Herz geschlossen. override ist eine unauffällige, aber effekte Fehlerabsicherung, vor allem im Umgang mit vielen kleinen Ableitungen. Leider kann VC10 noch kein foreach oder strong enums.

So, das waren meine bisherigen Erfahrungen. Ich hoffe, es war für den Einen oder Anderen interessant. Ich habe auch kein Problem damit, den ganzen Code irgendwo hochzuladen, aber die GUI hat halt doch noch ein paar Dependencies auf unser Framework - Timer und Matheklassen. Wen es interessiert, der möge sich melden.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Schrompf« (18.08.2011, 12:13)


27

18.08.2011, 13:10

Ich fände so eine Art OpenSource Scaleform nicht schlecht :) Wobei das ganze wohl erst richtig Sinn machen würde, wenn es auch einen entsprechenden Editor a'la Adobe Flash Professional gibt. Da Flash-Animationen ja mittlerweile auch nach HTML5 exportierbar sind, wäre eine leichtgewichtige Browserintegration, der man möglichst viele APIs (Renderer, Threading etc.) reinreichen kann, vielleicht wirklich am besten.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Chromanoid« (18.08.2011, 13:38)


idontknow

unregistriert

28

18.08.2011, 13:42

Wie funzt denn dieses Scaleform? Hab das schon öfters gelesen, dass Spielehersteller das verwenden aber auf der Seite selber steht nur was es ist (was mir nicht viel sagt!) und eben einige Demos!

29

18.08.2011, 13:46

Naja GUI in Flash Professional basteln (mit ein paar Einschränkungen). http://udn.epicgames.com/Three/Scaleform.html
Man kann dann per Actionscript ins Spiel Events raushauen/aus dem Spiel reinbekommen... Außerdem hat man APIs um Funktionsaufrufe u.Ä. auszulösen. http://udn.epicgames.com/Three/ScaleformTechnicalGuide.html

Das ganze ist natürlich nicht sehr minimal. Aber ich denke bei GUIs kommt es vor allem darauf an, dass die Gestaltung möglichst bequem und einfach ist (unter der Voraussetzung, dass das ganze trotzdem performant ist). Mit Flash Professional kommt man da der optimalen IDE für Game GUIs schon ziemlich nahe :).

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Chromanoid« (18.08.2011, 13:53)


Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

30

18.08.2011, 14:05

Scaleform sind halt die Profis :-) Die Technik finde ich beeindruckend, und performant scheint das Ganze auch zu sein. Sie nutzen quasi Flash, so dass Du die ganzen Tools dafür benutzen kannst, haben aber ihren eigenen Interpreter dahintergeklemmt, wodurch sie schon früh 3D-Hardware nutzen konnten, auf allen möglichen Plattformen laufen und vor allem ordentlich mit der Host-Anwendung integriert werden können.

Die FAQ auf ihrer Webseite spricht allerdings von 1 bis 4 Wochen Arbeitszeit für eine Integration in die Game Engine. Hm. In der Zeit hab ich einen substanziellen Teil davon selbstgeschrieben. Aber es geht ja nicht um den Code selbst - es sind mal wieder die Tools und der ganze Workflow, die den Unterschied zu Privat-Hanseln wie mir ausmachen.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Werbeanzeige