This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Defold bietet dir einen eigens entwickelten GUI-Editor und leistungsfähige Skriptmöglichkeiten, die auf die Gestaltung und Implementierung von Benutzeroberflächen zugeschnitten sind.
Eine grafische Benutzeroberfläche in Defold ist eine Komponente (component), die du erstellst, einem Spielobjekt (game object) hinzufügst und in einer Sammlung (collection) platzierst. Diese Komponente hat die folgenden Eigenschaften:
GUI-Komponenten werden unabhängig von der Spielansicht gerendert. Deshalb werden sie nicht an einer bestimmten Position im Sammlungseditor platziert und haben dort auch keine visuelle Darstellung. GUI-Komponenten müssen jedoch zu einem Spielobjekt gehören, das eine Position in einer Sammlung hat. Das Ändern dieser Position hat keine Auswirkung auf die GUI.
GUI-Komponenten werden aus einer Prototypdatei für eine GUI-Szene erstellt (in anderen Engines auch als „Prefabs“ oder „Baupläne“ bekannt). Um eine neue GUI-Komponente zu erstellen, klicke mit der rechten Maustaste auf eine Stelle im Browser Assets und wähle New ▸ Gui. Gib einen Namen für die neue GUI-Datei ein und drücke Ok.

Defold öffnet die Datei nun automatisch im GUI-Szeneneditor.

Die Ansicht Outline listet den gesamten Inhalt der GUI auf: die Liste ihrer Knoten (nodes) und alle Abhängigkeiten (siehe unten).
Der zentrale Bearbeitungsbereich zeigt die GUI. Die Werkzeugleiste oben rechts im Bearbeitungsbereich enthält die Werkzeuge Move, Rotate und Scale sowie eine Auswahl für das Layout.

Ein weißes Rechteck zeigt die Grenzen des aktuell ausgewählten Layouts mit der standardmäßigen Anzeigebreite und -höhe aus den Projekteinstellungen.
Wenn du den Wurzelknoten „Gui“ in der Ansicht Outline auswählst, zeigt Properties die Eigenschaften der GUI-Komponente an:
Per Node passt jeden Knoten an die angepasste Größe des übergeordneten Knotens oder an den Bildschirm mit geänderter Größe an.Disable schaltet den Anpassungsmodus der Knoten aus. Dadurch behalten alle Knoten ihre eingestellte Größe bei.128. Dazu gehören Texturen, die mit gui.new_texture() erstellt werden, sowie externe Texturen, die der GUI mit go.set(..., "textures", ...) oder gui.set(msg.url(), "textures", ...) zugewiesen werden. Projekte, die viele externe Texturen ersetzen, müssen diesen Grenzwert möglicherweise erhöhen.Du kannst GUI-Eigenschaften zur Laufzeit aus einer Skriptkomponente heraus mit go.get() und go.set() ändern:

go.property("mybigfont", resource.font("/assets/mybig.font"))
function init(self)
-- get the font file currently assigned to the font with id 'default'
print(go.get("#gui", "fonts", { key = "default" })) -- /builtins/fonts/default.font
-- set the font with id 'default' to the font file assigned to the resource property 'mybigfont'
go.set("#gui", "fonts", self.mybigfont, { key = "default" })
-- get the new font file assigned to the font with id 'default'
print(go.get("#gui", "fonts", { key = "default" })) -- /assets/mybig.font
end

go.property("myeffect", resource.material("/assets/myeffect.material"))
function init(self)
-- get the material file currently assigned to the material with id 'effect'
print(go.get("#gui", "materials", { key = "effect" })) -- /effect.material
-- set the material id 'effect' to the material file assigned to the resource property 'myeffect'
go.set("#gui", "materials", self.myeffect, { key = "effect" })
-- get the new material file assigned to the material with id 'effect'
print(go.get("#gui", "materials", { key = "effect" })) -- /assets/myeffect.material
end

go.property("mytheme", resource.atlas("/assets/mytheme.atlas"))
function init(self)
-- get the texture file currently assigned to the texture with id 'theme'
print(go.get("#gui", "textures", { key = "theme" })) -- /theme.atlas
-- set the texture with id 'theme' to the texture file assigned to the resource property 'mytheme'
go.set("#gui", "textures", self.mytheme, { key = "theme" })
-- get the new texture file assigned to the texture with id 'theme'
print(go.get("#gui", "textures", { key = "theme" })) -- /assets/mytheme.atlas
end
Der Ressourcenbaum eines Defold-Spiels ist statisch. Daher musst du alle Abhängigkeiten, die du für deine GUI-Knoten benötigst, zur Komponente hinzufügen. Die Ansicht Outline gruppiert alle Abhängigkeiten nach Typ in „Ordnern“:

Um eine neue Abhängigkeit hinzuzufügen, ziehe sie aus dem Bereich Asset in die Editoransicht und lege sie dort ab.
Alternativ kannst du mit der rechten Maustaste auf den Wurzelknoten „Gui“ in der Ansicht Outline klicken und anschließend Add ▸ [type] aus dem eingeblendeten Kontextmenü wählen.
Du kannst auch mit der rechten Maustaste auf das Ordnersymbol des Typs klicken, den du hinzufügen möchtest, und Add ▸ [type] wählen.
Eine GUI-Komponente besteht aus einer Menge von Knoten. Knoten sind einfache Elemente. Du kannst sie entweder im Editor oder zur Laufzeit per Skript transformieren (verschieben, skalieren und drehen) und in Eltern-Kind-Hierarchien anordnen. Es gibt die folgenden Knotentypen:
Füge Knoten hinzu, indem du mit der rechten Maustaste auf den Ordner Nodes klickst und Add ▸ und anschließend Box, Text, Pie, Template oder ParticleFx wählst.

Du kannst auch A drücken und den Typ auswählen, den du der GUI hinzufügen möchtest.
Jeder Knoten verfügt über eine umfangreiche Menge von Eigenschaften, die sein Aussehen steuern:
Manual setzt, kannst du den Wert jedoch ändern. Die Größe legt die Grenzen des Knotens fest und wird verwendet, um Knoten bei Eingaben zu ermitteln. Dieser Wert lässt sich per Skript animieren (mehr erfahren).Automatic legt der Editor eine Größe für den Knoten fest. Bei Manual kannst du die Größe selbst festlegen.gui.pick_node() ermittelt werden. Verwende gui.set_enabled() und gui.is_enabled(), um diese Eigenschaft per Code zu ändern und zu prüfen.gui.pick_node() ermittelt werden. Verwende gui.set_visible() und gui.get_visible(), um diese Eigenschaft per Code zu ändern und zu prüfen.0 ergibt keinen Zeilenabstand. 1 (der Standardwert) ergibt den normalen Zeilenabstand.Alpha mischt die Pixelwerte des Knotens anhand des Alphawerts mit dem Hintergrund. Dies entspricht dem Mischmodus „Normal“ in Grafikprogrammen.Add addiert die Pixelwerte des Knotens zu denen des Hintergrunds. Dies entspricht „Linear dodge“ in manchen Grafikprogrammen.Multiply multipliziert die Pixelwerte des Knotens mit denen des Hintergrunds.Screen multipliziert die Pixelwerte des Knotens mit denen des Hintergrunds invers. Dies entspricht dem Mischmodus „Screen“ in Grafikprogrammen.Mögliche Werte sind Center, North, South, East, West, North West, North East, South West oder South East.

Wenn du den Bezugspunkt eines Knotens änderst, wird der Knoten so verschoben, dass sich der neue Bezugspunkt an der Position des Knotens befindet. Textknoten werden so ausgerichtet, dass Center den Text zentriert, West ihn linksbündig und East ihn rechtsbündig ausrichtet.

Die folgenden Verankerungsmodi sind verfügbar:
None (sowohl für X Anchor als auch für Y Anchor) behält die Position des Knotens vom Mittelpunkt des übergeordneten Knotens oder der Szene aus relativ zu dessen bzw. deren angepasster Größe bei.Left oder Right (X Anchor) skaliert die horizontale Position des Knotens so, dass der prozentuale Abstand zum linken und rechten Rand des übergeordneten Knotens oder der Szene gleich bleibt.Top oder Bottom (Y Anchor) skaliert die vertikale Position des Knotens so, dass der prozentuale Abstand zum oberen und unteren Rand des übergeordneten Knotens oder der Szene gleich bleibt.
Ein Knoten, der in einer Szene mit einer typischen logischen Auflösung im Querformat erstellt wurde:

Wenn die Szene an einen Bildschirm im Hochformat angepasst wird, wird sie gestreckt. Das Begrenzungsrechteck jedes Knotens wird auf dieselbe Weise gestreckt. Über den Anpassungsmodus lässt sich jedoch das Seitenverhältnis des Knoteninhalts beibehalten. Die folgenden Modi sind verfügbar:
Fit skaliert den Knoteninhalt so, dass er der Breite oder Höhe des gestreckten Begrenzungsrechtecks entspricht, je nachdem, welcher Wert kleiner ist. Mit anderen Worten: Der Inhalt passt vollständig in das gestreckte Begrenzungsrechteck des Knotens.Zoom skaliert den Knoteninhalt so, dass er der Breite oder Höhe des gestreckten Begrenzungsrechtecks entspricht, je nachdem, welcher Wert größer ist. Mit anderen Worten: Der Inhalt bedeckt das gestreckte Begrenzungsrechteck des Knotens vollständig.Stretch streckt den Knoteninhalt so, dass er das gestreckte Begrenzungsrechteck des Knotens ausfüllt.
Wenn die Eigenschaft Adjust Reference der GUI-Szene auf Disabled gesetzt ist, wird diese Einstellung ignoriert.
None rendert den Knoten wie gewohnt.Stencil lässt die Knotengrenzen eine Stencil-Maske definieren, mit der die untergeordneten Knoten beschnitten werden.Einzelheiten findest du im Handbuch zum Beschneiden von GUIs.
Die Kombination aus Bezugspunkt, Verankerungen und Anpassungsmodus ermöglicht eine sehr flexible Gestaltung von GUIs. Ohne ein konkretes Beispiel kann es jedoch etwas schwierig sein, ihr Zusammenspiel zu verstehen. Nehmen wir diesen GUI-Entwurf für einen Bildschirm mit 640 × 1136 Pixeln als Beispiel:

Die Benutzeroberfläche wurde erstellt, indem X Anchor und Y Anchor auf None gesetzt wurden und Adjust Mode für jeden Knoten auf dem Standardwert Fit belassen wurde. Der Bezugspunkt Pivot des oberen Bereichs ist North, der Bezugspunkt des unteren Bereichs ist South und die Bezugspunkte der Balken im oberen Bereich sind auf West gesetzt. Bei den übrigen Knoten sind die Bezugspunkte auf Center gesetzt. Wenn wir das Fenster verbreitern, geschieht Folgendes:

Was ist nun, wenn der obere und der untere Balken immer so breit wie der Bildschirm sein sollen? Wir können Adjust Mode für die grauen Hintergrundbereiche oben und unten auf Stretch ändern:

Das ist besser. Die grauen Hintergrundbereiche werden nun immer auf die Breite des Fensters gestreckt, aber die Balken im oberen Bereich und die beiden Rechtecke unten sind nicht richtig positioniert. Wenn die oberen Balken links positioniert bleiben sollen, müssen wir X Anchor von None auf Left ändern:

Genau so soll der obere Bereich aussehen. Die Bezugspunkte Pivot der Balken im oberen Bereich waren bereits auf West gesetzt. Dadurch werden die Balken passend positioniert: Ihr linker bzw. westlicher Rand (Pivot) ist am linken Rand des übergeordneten Bereichs verankert (X Anchor).
Wenn wir nun X Anchor für das linke Rechteck auf Left und X Anchor für das rechte Rechteck auf Right setzen, erhalten wir folgendes Ergebnis:

Das ist nicht ganz das erwartete Ergebnis. Die beiden Rechtecke sollten genauso nahe am linken und rechten Rand bleiben wie die beiden Balken im oberen Bereich. Der Grund dafür ist der falsche Bezugspunkt Pivot:

Bei beiden Rechtecken ist der Bezugspunkt Pivot auf Center gesetzt. Das bedeutet, dass der Mittelpunkt (der Bezugspunkt) der Rechtecke bei einer Verbreiterung des Bildschirms denselben relativen Abstand von den Rändern behält. Beim linken Rechteck betrug er im ursprünglichen Fenster mit 640 × 1136 Pixeln 17 % vom linken Rand:

Wenn die Bildschirmgröße geändert wird, bleibt der Mittelpunkt des linken Rechtecks beim selben Abstand von 17 % vom linken Rand:

Wenn wir den Bezugspunkt Pivot für das linke Rechteck von Center auf West und für das rechte Rechteck auf East ändern und die Rechtecke neu positionieren, erhalten wir auch bei einer Änderung der Bildschirmgröße das gewünschte Ergebnis:

Alle Knoten werden in der Reihenfolge gerendert, in der sie im Ordner „Nodes“ aufgelistet sind. Der oberste Knoten in der Liste wird zuerst gezeichnet und erscheint daher hinter allen anderen Knoten. Der letzte Knoten in der Liste wird zuletzt gezeichnet und erscheint somit vor allen anderen Knoten. Das Ändern des Z-Werts eines Knotens steuert nicht seine Zeichenreihenfolge. Wenn du den Z-Wert jedoch außerhalb des Renderbereichs deines Render-Skripts setzt, wird der Knoten nicht mehr auf dem Bildschirm gerendert. Du kannst die Indexreihenfolge der Knoten mit Ebenen überschreiben (siehe unten).

Wähle einen Knoten aus und drücke Alt + Up/Down, um ihn nach oben oder unten zu verschieben und seine Indexreihenfolge zu ändern.
Die Zeichenreihenfolge lässt sich per Skript ändern:
local bean_node = gui.get_node("bean")
local shield_node = gui.get_node("shield")
if gui.get_index(shield_node) < gui.get_index(bean_node) then
gui.move_above(shield_node, bean_node)
end
Du ordnest einen Knoten einem anderen unter, indem du ihn auf den Knoten ziehst, der sein übergeordneter Knoten werden soll. Ein untergeordneter Knoten erbt die Transformation (Position, Drehung und Skalierung), die auf den übergeordneten Knoten angewendet wird, relativ zu dessen Bezugspunkt.

Übergeordnete Knoten werden vor ihren untergeordneten Knoten gezeichnet. Verwende Ebenen, um die Zeichenreihenfolge über- und untergeordneter Knoten zu ändern und das Rendering der Knoten zu optimieren (siehe unten).
Ebenen ermöglichen eine genaue Steuerung, wie Knoten gezeichnet werden, und können die Anzahl der Zeichenaufrufe (draw calls) verringern, die die Engine zum Zeichnen einer GUI-Szene erzeugen muss. Bevor die Engine die Knoten einer GUI-Szene zeichnet, bündelt sie deren Zeichenoperationen (Batching) anhand der folgenden Bedingungen:
Wenn sich ein Knoten in einem dieser Punkte vom vorherigen unterscheidet, unterbricht er die Bündelung und erzeugt einen weiteren Zeichenaufruf. Beschneidende Knoten unterbrechen die Bündelung immer, ebenso jeder Stencil-Gültigkeitsbereich.
Die Möglichkeit, Knoten in Hierarchien anzuordnen, erleichtert die Gruppierung von Knoten zu überschaubaren Einheiten. Wenn du verschiedene Knotentypen mischst, können Hierarchien das gebündelte Rendern jedoch praktisch unterbinden:

Wenn die Rendering-Pipeline die Knotenliste durchläuft, muss sie für jeden einzelnen Knoten eine eigene Gruppe von Zeichenoperationen anlegen, weil sich die Typen unterscheiden. Insgesamt erfordern diese drei Schaltflächen sechs Zeichenaufrufe.
Indem du den Knoten Ebenen zuweist, kannst du sie anders anordnen. Dadurch kann die Rendering-Pipeline die Knoten in weniger Zeichenaufrufen zusammenfassen. Füge zunächst der Szene die benötigten Ebenen hinzu. Klicke mit der rechten Maustaste auf das Ordnersymbol „Layers“ in der Ansicht Outline und wähle Add ▸ Layer. Markiere die neue Ebene und weise ihr für die Eigenschaft Name in der Ansicht Properties einen Wert zu.

Setze anschließend die Eigenschaft Layer jedes Knotens auf die entsprechende Ebene. Die Zeichenreihenfolge der Ebenen hat Vorrang vor der regulären Indexreihenfolge der Knoten. Wenn du die Box-Knoten mit den Schaltflächengrafiken auf „graphics“ und die Textknoten der Schaltflächen auf „text“ setzt, ergibt sich daher folgende Zeichenreihenfolge:
Zuerst alle Knoten der Ebene „graphics“, von oben nach unten:
Dann alle Knoten der Ebene „text“, von oben nach unten:
Die Knoten können nun in zwei statt sechs Zeichenaufrufen gebündelt werden. Ein großer Leistungsgewinn!
Beachte, dass ein untergeordneter Knoten ohne festgelegte Ebene die Ebeneneinstellung seines übergeordneten Knotens implizit erbt. Wenn du für einen Knoten keine Ebene festlegst, wird er implizit der Ebene „null“ hinzugefügt, die vor allen anderen Ebenen gezeichnet wird.