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 te proporciona un editor GUI personalizado y potentes posibilidades de scripting diseñadas específicamente para la construcción e implementación de interfaces de usuario.
Una interfaz gráfica de usuario en Defold es un componente que construyes, adjuntas a un objeto de juego y colocas en una colección. Este componente tiene las siguientes propiedades:
Los componentes GUI se renderizan de forma independiente de la vista del juego. Por eso no se colocan en una ubicación concreta en el editor de colecciones ni tienen una representación visual en el editor de colecciones. Sin embargo, los componentes GUI deben residir en un objeto de juego que sí tiene una ubicación en una colección. Cambiar esa ubicación no tiene efecto en la GUI.
Los componentes GUI se crean a partir de un archivo prototipo de escena GUI (también conocido como “prefabs” o “blueprints” en otros motores). Para crear un nuevo componente GUI, haz click derecho en una ubicación del navegador Assets y selecciona New ▸ Gui. Escribe un nombre para el nuevo archivo GUI y presiona Ok.

Defold ahora abre automáticamente el archivo en el editor de escenas GUI.

Outline lista todo el contenido de la GUI: su lista de nodos y cualquier dependencia (ver abajo).
El área central de edición muestra la GUI. La barra de herramientas en la esquina superior derecha del área de edición contiene las herramientas Move, Rotate y Scale, además de un selector de layout.

Un rectángulo blanco muestra los límites del layout seleccionado actualmente, con el ancho y la altura de visualización predeterminados definidos en la configuración del proyecto.
Al seleccionar el nodo raíz “Gui” en Outline se muestran las propiedades del componente GUI en Properties:
Per Node ajusta cada nodo contra el tamaño ajustado del nodo padre o de la pantalla redimensionada.Disable desactiva el modo de ajuste de nodos. Esto fuerza a todos los nodos a conservar el tamaño que tienen definido.gui.new_texture()Puedes manipular propiedades GUI en tiempo de ejecución desde un componente script usando go.get() y go.set():

go.property("mybigfont", resource.font("/assets/mybig.font"))
function init(self)
-- obtener el archivo de fuente asignado actualmente a la fuente con id 'default'
print(go.get("#gui", "fonts", { key = "default" })) -- /builtins/fonts/default.font
-- asignar a la fuente con id 'default' el archivo de fuente asignado a la propiedad de recurso 'mybigfont'
go.set("#gui", "fonts", self.mybigfont, { key = "default" })
-- obtener el nuevo archivo de fuente asignado a la fuente con id 'default'
print(go.get("#gui", "fonts", { key = "default" })) -- /assets/mybig.font
end

go.property("myeffect", resource.material("/assets/myeffect.material"))
function init(self)
-- obtener el archivo de material asignado actualmente al material con id 'effect'
print(go.get("#gui", "materials", { key = "effect" })) -- /effect.material
-- asignar al material con id 'effect' el archivo de material asignado a la propiedad de recurso 'myeffect'
go.set("#gui", "materials", self.myeffect, { key = "effect" })
-- obtener el nuevo archivo de material asignado al material con id 'effect'
print(go.get("#gui", "materials", { key = "effect" })) -- /assets/myeffect.material
end

go.property("mytheme", resource.atlas("/assets/mytheme.atlas"))
function init(self)
-- obtener el archivo de textura asignado actualmente a la textura con id 'theme'
print(go.get("#gui", "textures", { key = "theme" })) -- /theme.atlas
-- asignar a la textura con id 'theme' el archivo de textura asignado a la propiedad de recurso 'mytheme'
go.set("#gui", "textures", self.mytheme, { key = "theme" })
-- obtener el nuevo archivo de textura asignado a la textura con id 'theme'
print(go.get("#gui", "textures", { key = "theme" })) -- /assets/mytheme.atlas
end
El árbol de recursos en un juego Defold es estático, así que cualquier dependencia que necesites para tus nodos GUI debe añadirse al componente. Outline agrupa todas las dependencias por tipo bajo “carpetas”:

Para añadir una nueva dependencia, arrástrala y suéltala desde el panel Asset a la vista del editor.
Como alternativa, haz click derecho en la raíz “Gui” en Outline y luego selecciona Add ▸ [type] en el menú contextual emergente.
También puedes hacer click derecho en el icono de carpeta del tipo que quieres añadir y seleccionar Add ▸ [type].
Un componente GUI se construye a partir de un conjunto de nodos. Los nodos son elementos simples. Se pueden transformar (mover, escalar y rotar) y ordenar en jerarquías padre-hijo, ya sea en el editor o en tiempo de ejecución mediante scripting. Existen los siguientes tipos de nodo:
Añade nodos haciendo click derecho en la carpeta Nodes y seleccionando Add ▸ y luego Box, Text, Pie, Template o ParticleFx.

También puedes presionar A y seleccionar el tipo que quieres añadir a la GUI.
Cada nodo tiene un conjunto amplio de propiedades que controlan su apariencia:
Manual puedes alterar el valor. El tamaño define los límites del nodo y se usa al hacer selección por input. Este valor se puede animar desde script (más información).Automatic, el editor definirá un tamaño para el nodo. Si se define en Manual, puedes definir el tamaño tú mismo.gui.pick_node(). Usa gui.set_enabled() y gui.is_enabled() para cambiar y comprobar esta propiedad mediante programación.gui.pick_node(). Usa gui.set_visible() y gui.get_visible() para cambiar y comprobar esta propiedad mediante programación.0 no da interlineado. 1 (el valor predeterminado) es el interlineado normal.Alpha mezcla con alpha los valores de píxel del nodo con el fondo. Esto corresponde al modo de mezcla “Normal” en software gráfico.Add suma los valores de píxel del nodo con el fondo. Esto corresponde a “Linear dodge” en algunos software gráficos.Multiply multiplica los valores de píxel del nodo con el fondo.Screen multiplica inversamente los valores de píxel del nodo con el fondo. Esto corresponde al modo de mezcla “Screen” en software gráfico.Los valores posibles son Center, North, South, East, West, North West, North East, South West o South East.

Si cambias el pivot de un nodo, el nodo se moverá para que el nuevo pivot quede en la posición del nodo. Los nodos de texto se alinean de modo que Center centra el texto, West alinea el texto a la izquierda y East alinea el texto a la derecha.

Están disponibles los siguientes modos de anclaje:
None (para X Anchor y Y Anchor) conserva la posición del nodo desde el centro del nodo padre o de la escena, relativa a su tamaño ajustado.Left o Right (X Anchor) escala la posición horizontal del nodo para que mantenga la posición desde los bordes izquierdo y derecho del nodo padre o de la escena en el mismo porcentaje.Top o Bottom (Y Anchor) escala la posición vertical del nodo para que mantenga la posición desde los bordes superior e inferior del nodo padre o de la escena en el mismo porcentaje.
Un nodo creado en una escena donde la resolución lógica es una resolución horizontal típica:

Ajustar la escena a una pantalla vertical hace que la escena se estire. La caja delimitadora de cada nodo se estira del mismo modo. Sin embargo, al definir el modo de ajuste, la relación de aspecto del contenido del nodo puede mantenerse intacta. Están disponibles los siguientes modos:
Fit escala el contenido del nodo para que sea igual al ancho o alto de la caja delimitadora estirada, el que sea menor. En otras palabras, el contenido encajará dentro de la caja delimitadora estirada del nodo.Zoom escala el contenido del nodo para que sea igual al ancho o alto de la caja delimitadora estirada, el que sea mayor. En otras palabras, el contenido cubrirá por completo la caja delimitadora estirada del nodo.Stretch estira el contenido del nodo para que rellene la caja delimitadora estirada del nodo.
Si la propiedad de escena GUI Adjust Reference se define en Disabled, esta configuración se ignorará.
None renderiza el nodo como de costumbre.Stencil hace que los límites del nodo definan una máscara stencil que se usa para recortar los nodos hijos del nodo.Consulta el manual de clipping de GUI para obtener detalles.
La combinación de las propiedades Pivot, Anchors y Adjust Mode permite un diseño de GUI muy flexible, pero puede ser algo difícil entender cómo funciona todo sin mirar un ejemplo concreto. Tomemos como ejemplo este mockup de GUI creado para una pantalla de 640x1136:

La interfaz se crea con X Anchor e Y Anchor definidos en None, y el Adjust Mode de cada nodo se deja en el valor predeterminado de Fit. El punto Pivot del panel superior es North, el pivot del panel inferior es South y el punto pivot de las barras del panel superior se define en West. El resto de los nodos tiene puntos pivot definidos en Center. Si redimensionamos la ventana para hacerla más ancha, esto es lo que ocurre:

Ahora, ¿qué pasa si queremos que las barras superior e inferior siempre sean tan anchas como la pantalla? Podemos cambiar el Adjust Mode de los paneles de fondo grises de arriba y abajo a Stretch:

Esto es mejor. Los paneles de fondo grises ahora siempre se estirarán al ancho de la ventana, pero las barras del panel superior, así como las dos cajas de la parte inferior, no están posicionadas correctamente. Si queremos mantener las barras de arriba posicionadas a la izquierda, necesitamos cambiar X Anchor de None a Left:

Eso es exactamente lo que queremos para el panel superior. Las barras del panel superior ya tenían sus puntos Pivot definidos en West, lo que significa que se posicionarán correctamente con el borde izquierdo/oeste de las barras (Pivot) anclado al borde izquierdo del panel padre (X Anchor).
Ahora, si definimos X Anchor en Left para la caja de la izquierda y X Anchor en Right para la caja de la derecha, obtenemos el siguiente resultado:

Este no es exactamente el resultado esperado. Las dos cajas deberían permanecer tan cerca de los bordes izquierdo y derecho como las dos barras del panel superior. La razón es que el punto Pivot es incorrecto:

Ambas cajas tienen un punto Pivot definido en Center. Esto significa que, cuando la pantalla se vuelve más ancha, el punto central (el punto pivot) de las cajas permanecerá a la misma distancia relativa de los bordes. En el caso de la caja izquierda, estaba a un 17% del borde izquierdo con la ventana original de 640x1136:

Cuando se redimensiona la pantalla, el punto central de la caja izquierda permanece a la misma distancia de 17% del borde izquierdo:

Si cambiamos el punto Pivot de Center a West para la caja de la izquierda y a East para la caja de la derecha, y reposicionamos las cajas, obtenemos el resultado que buscamos incluso cuando se redimensiona la pantalla:

Todos los nodos se renderizan en el orden en que aparecen bajo la carpeta “Nodes”. El nodo en la parte superior de la lista se dibuja primero y por lo tanto aparecerá detrás de todos los demás nodos. El último nodo de la lista se dibuja al final, lo que significa que aparecerá delante de todos los demás nodos. Alterar el valor Z de un nodo no controla su orden de dibujo; sin embargo, si defines el valor Z fuera del rango de renderizado de tu render script, el nodo ya no se renderizará en pantalla. Puedes anular el orden por índice de los nodos con capas (ver abajo).

Selecciona un nodo y presiona Alt + Up/Down para mover un nodo hacia arriba o hacia abajo y cambiar su orden de índice.
El orden de dibujo se puede cambiar en script:
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
Un nodo se convierte en hijo de otro nodo arrastrándolo sobre el nodo que quieres que sea el padre del hijo. Un nodo con un padre hereda la transformación (posición, rotación y escala) aplicada al padre y relativa al pivot del padre.

Los padres se dibujan antes que sus hijos. Usa capas para cambiar el orden de dibujo de los nodos padre e hijo y para optimizar el renderizado de nodos (ver abajo).
Las capas proporcionan control preciso sobre cómo se dibujan los nodos y se pueden usar para reducir la cantidad de draw calls que el motor debe crear para dibujar una escena GUI. Cuando el motor está a punto de dibujar los nodos de una escena GUI, agrupa los nodos en lotes de draw calls según las siguientes condiciones:
Si un nodo difiere del anterior en cualquiera de estos puntos, romperá el lote y creará otra draw call. Los nodos de clipping siempre rompen el lote y cada ámbito stencil también rompe el lote.
La capacidad de organizar nodos en jerarquías facilita agrupar nodos en unidades manejables. Pero las jerarquías pueden romper efectivamente el renderizado en lotes si mezclas distintos tipos de nodo:

Cuando el pipeline de renderizado recorre la lista de nodos, se ve forzado a preparar un lote separado para cada nodo independiente porque los tipos son diferentes. En total, estos tres botones requerirán seis draw calls.
Al asignar capas a los nodos, se pueden ordenar de forma diferente, lo que permite que el pipeline de renderizado agrupe los nodos en menos draw calls. Empieza añadiendo a la escena las capas que necesites. Haz click derecho en el icono de carpeta “Layers” en Outline y selecciona Add ▸ Layer. Selecciona la nueva capa y asígnale una propiedad Name en la vista Properties.

Luego define la propiedad Layer en cada nodo con la capa correspondiente. El orden de dibujo de capas tiene prioridad sobre el orden normal de nodos por índice, por lo que definir los nodos caja de gráficos de botón como “graphics” y los nodos de texto de botón como “text” dará como resultado el siguiente orden de dibujo:
Primero todos los nodos en la capa “graphics”, desde arriba:
Luego todos los nodos en la capa “text”, desde arriba:
Los nodos ahora se pueden agrupar en dos draw calls, en lugar de seis. Una mejora importante de rendimiento.
Ten en cuenta que un nodo hijo sin capa definida heredará implícitamente la configuración de capa de su nodo padre. No definir una capa en un nodo lo añade implícitamente a la capa “null”, que se dibuja antes que cualquier otra capa.