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

1

01.12.2013, 15:49

Layout eines GUIs festlegen

Hallo zusammen,

ich programmiere gerade ein GUI für mein Spiel. Das GUI ist sehr einfach aufgebaut: Es gibt eine Basisklasse "Widget", von der alle GUI-Elemente abgeleitet sind. Jedem Element können Kindelemente zugewiesen werden. Dadurch ergibt sich eine baumartige Hierarchie.

Nun überlege ich mir, wie ich das Layout des GUIs am besten steuern könnte, also die Anordnung der einzelnen Elemente. Eine Möglichkeit wäre, die XY-Position jedes Elements einfach relativ zum Parent festzulegen. Das würde in vielen Situationen auch gut funktionieren, aber nicht in allen. Beispielsweise wenn sich die Größe oder der Inhalt eines Elements verändern kann (Elemente kommen hinzu, werden entfernt usw.).

In Java werden für AWT und Swing (soweit ich vom Hörensagen weiß) Layout-Manager benutzt, mit denen sich bestimmen lässt, wie sich die Komponenten eines Containers anordnen sollen. Das wäre also eine weitere Möglichkeit. Da ich diese Layout-Manager jedoch noch nie verwendet habe, kann ich nicht beurteilen, wie gut diese in der Praxis funktionieren.

Man könnte auch versuchen, beide Ansätze miteinander zu verbinden: Standardmäßig wird die Anordung der Elemente von einem Layout-Manager übernommen, aber man räumt auch die Möglichkeit ein, einzelne Elemente aus dem festgelegten Elementfluss herauszunehmen und relativ zum Parent zu positionieren. Dieses Verhalten wäre in etwa mit dem von HTML/CSS vergleichbar.

Habt ihr weitere Vorschläge?
Oder könnt ihr bestimmte Ansätze empfehlen oder davon abraten?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

01.12.2013, 16:31

MIt dem Thema habe ich mich auch schon intensiv beschäftigt. Interessant ist, inwieweit du mehrere Auflösungen mit derselben GUI-Definition nutzen willst. Ich persönliche finde da den Layouter-Ansatz sehr gut. Man muss keine Koordinaten angeben und ist dadurch gezwungen, auflösungsunabhängige GUIs zu erstellen. Wobei ich die Layouter von Java nicht gut finde. Die von WPF sind wesentlich besser, meiner Erfahrung nach.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

01.12.2013, 17:15

Ich persönlich mag es simpel - Relative Koordinaten zum Parent in Absolut- und Relativwerten durch die Möglichkeiten Left/Center/Right mit Margin.
Die Java Layout-Manager sind furchtbar. WPF benutzt eigentlich keine Layout-Manager in dem Sinn, sondern auch relative Koordinaten mit Margins und Left/Center/Right.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

4

01.12.2013, 19:17

@TrommlBomml

Ich habe mir mal auf dieser Seite einen Überblick über WPF verschafft. Wenn ich das richtig verstehe, gibt es mehrere Panel-Klassen, die jeweils ein anderes Layout implementieren. In einem StackPanel etwa werden die Elemente unter- bzw. nebeneinander angeordnet, in einem Canvas können die Elemente relativ zum Parent platziert werden usw. Zusätzlich hat man, wie BlueCobold erwähnt hat, noch die Möglichkeit, für jedes Element die Abstände und die Ausrichtung festzulegen. Das gefällt mir ziemlich gut. Danke für den Tipp.

Ich denke auch, dass solche Layouts gut dazu geeignet sind, um auflösungsunabhängige Layouts umzusetzen. In meinem Fall ist das nicht ganz so wichtig, weil mein Spiel nur für Desktop-PCs gedacht ist. Mir reicht es schon, bei Bedarf einfach das gesamte GUI zu skalieren.


@BlueCobold

Relative Koordinaten wären mir auch wichtig, um beispielsweise bestimmte Elemente am Rand des umgebenen Containers platzieren zu können. Einen Mix aus festgelegtem Layout und freier Platzierung stelle ich mir ziemlich ideal vor.

Die Layout-Manager von Java scheinen ja nicht besonders beliebt zu sein. Zumindest hatte ich diesen Eindruck auch schon nach meiner kleinen Recherche gewonnen (die meisten meiner Suchergebnisse bezogen sich auf Java). Die werde ich mir also besser nicht zum Vorbild nehmen. ;)


@---

Dann werde ich mich wohl zunächst an der WPF orientieren. Die hat mir bisher recht gut gefallen. Ich werde dann ja schon früh genug bemerken, inwieweit das für meine Zwecke passt und was ich daran eventuell noch anpassen kann.

5

01.12.2013, 23:26

Du könntest dich mal mit dem wxFormbuilder oder QtDesigner beschäftigen. wxWidgets und Qt haben beide sehr umfangreiche Layoutoptionen, die in der jeweiligen Dokumentation erklärt werden. Und mit diesen GUI-Design Tools kannst du damit rumspielen und sie verstehen lernen, ohne eine Zeile Code schreiben zu müssen. Das wird gewiss eine ganz gute Inspiration sein.
Lieber dumm fragen, als dumm bleiben!

6

02.12.2013, 00:13

Ach, an Qt hatte ich gar nicht mehr gedacht, obwohl ich doch selbst den Qt Creator benutze. Liegt wohl daran, dass ich keine Formanwendungen schreibe und mir deswegen den Qt Designer noch gar nicht näher angesehen habe. Kann ihn momentan auch nicht starten, weil bei mir nur die Standalone-Version des Creators installiert ist, aber das lässt sich ja schnell ändern. Danke für den Tipp. Ich werde den Designer mal ausprobieren.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

7

02.12.2013, 09:33

Ich denke auch, dass solche Layouts gut dazu geeignet sind, um auflösungsunabhängige Layouts umzusetzen. In meinem Fall ist das nicht ganz so wichtig, weil mein Spiel nur für Desktop-PCs gedacht ist. Mir reicht es schon, bei Bedarf einfach das gesamte GUI zu skalieren.


Dann ist der WPF-Ansatz nicht der richtige sondern der von BlueCobold :)

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

8

02.12.2013, 10:09

Ich persönlich finde SFGUI's Layouter recht praktisch, denn obwohl es empfohlen ist nur Layouters zu verwenden, so ist es jedoch auch kein Problem mal etwas zu fixieren. Wenn ich mich richtig erinnere, hat SFGUI vom Design her relative viel von GTK übernommen, kannst dir also auch mal GTK noch anschauen. ;)
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

Thoran

Alter Hase

Beiträge: 520

Wohnort: Stuttgart

Beruf: Senior Software Engineer

  • Private Nachricht senden

9

02.12.2013, 14:44

Ich bin verwirrt. Werden hier nicht zwei Sachen durcheinander gewürfelt? Das eine ist die Positionierung, entweder absolut oder relativ. Und das andere ist das Layouting (je nachdem wie komplex man das treibt) wodurch bei einer Änderung des Vaterwidgets, alle Kinder entsprechend skaliert werden.

Klar kann ich die Positionierung von Anfang an einem Layoutmanager übertragen, der dann auf der Basis von Constraints oder sonstigen Konstrukten versucht das anzulegen, was der Entwickler evtl. gemeint hat. Ich bevorzuge, das Anlegen der GUI über einen GUI-Editor, es sei denn man betreibt einen data-driven approach, der auch die GUI-Elemente bestimmt.

Auflösungsunabhängigkeit erreiche ich normalerweise damit, dass ich grunsätzlich im Interval [0;1] meine GUI-Widgets anlege. Während der Ausführung wird das dann mit der tatsächlich verfügbaren Auflösung entlang der Achsen multipliziert.
Mein Entwicklertagebuch
Aktuelles Projekt: Universum Espionage
Eingestellt:Spieleengine SilverCore
Organisator "Spieleentwickler Stammtisch Stuttgart"

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

02.12.2013, 15:16

Werden hier nicht zwei Sachen durcheinander gewürfelt? Das eine ist die Positionierung, entweder absolut oder relativ. Und das andere ist das Layouting (je nachdem wie komplex man das treibt) wodurch bei einer Änderung des Vaterwidgets, alle Kinder entsprechend skaliert werden.
Wenn Positionierung der Children relativ zum Parent erfolgt, ist auch das Layouting implizit enthalten.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige