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
O Defold fornece um editor GUI personalizado e recursos poderosos de scripting, feitos sob medida para a construção e implementação de interfaces de usuário.
Uma interface gráfica de usuário no Defold é um componente que você constrói, anexa a um objeto de jogo e coloca em uma coleção. Esse componente tem as seguintes propriedades:
Componentes GUI são renderizados independentemente da visualização do jogo. Por isso, eles não são colocados em um local específico no editor de coleção, nem têm uma representação visual no editor de coleção. No entanto, componentes GUI precisam residir em um objeto de jogo que tenha uma localização em uma coleção. Alterar essa localização não tem efeito sobre a GUI.
Componentes GUI são criados a partir de um arquivo de protótipo de cena GUI (também conhecido como “prefab” ou “blueprint” em outras engines). Para criar um novo componente GUI, clique com o botão direito em um local no navegador Assets e selecione New ▸ Gui. Digite um nome para o novo arquivo GUI e pressione Ok.

O Defold agora abre automaticamente o arquivo no editor de cenas GUI.

O Outline lista todo o conteúdo da GUI: sua lista de nodes e quaisquer dependências (veja abaixo).
A área central de edição mostra a GUI. A barra de ferramentas no canto superior direito da área de edição contém as ferramentas Move, Rotate e Scale, além de um seletor de layout.

Um retângulo branco mostra os limites do layout selecionado atualmente, ou da largura e altura de exibição padrão conforme definido nas configurações do projeto.
Selecionar o node raiz “Gui” no Outline mostra as Properties do componente GUI:
Per Node ajusta cada node em relação ao tamanho ajustado do node pai, ou à tela redimensionada.Disable desativa o modo de ajuste de node. Isso força todos os nodes a manterem seu tamanho definido.gui.new_texture()Você pode manipular propriedades de GUI em runtime a partir de um componente de script usando go.get() e go.set():

go.property("mybigfont", resource.font("/assets/mybig.font"))
function init(self)
-- obtém o arquivo de fonte atualmente atribuído à fonte com id 'default'
print(go.get("#gui", "fonts", { key = "default" })) -- /builtins/fonts/default.font
-- define a fonte com id 'default' para o arquivo de fonte atribuído à propriedade de recurso 'mybigfont'
go.set("#gui", "fonts", self.mybigfont, { key = "default" })
-- obtém o novo arquivo de fonte atribuído à fonte com id 'default'
print(go.get("#gui", "fonts", { key = "default" })) -- /assets/mybig.font
end

go.property("myeffect", resource.material("/assets/myeffect.material"))
function init(self)
-- obtém o arquivo de material atualmente atribuído ao material com id 'effect'
print(go.get("#gui", "materials", { key = "effect" })) -- /effect.material
-- define o id de material 'effect' para o arquivo de material atribuído à propriedade de recurso 'myeffect'
go.set("#gui", "materials", self.myeffect, { key = "effect" })
-- obtém o novo arquivo de material atribuído ao material com id 'effect'
print(go.get("#gui", "materials", { key = "effect" })) -- /assets/myeffect.material
end

go.property("mytheme", resource.atlas("/assets/mytheme.atlas"))
function init(self)
-- obtém o arquivo de textura atualmente atribuído à textura com id 'theme'
print(go.get("#gui", "textures", { key = "theme" })) -- /theme.atlas
-- define a textura com id 'theme' para o arquivo de textura atribuído à propriedade de recurso 'mytheme'
go.set("#gui", "textures", self.mytheme, { key = "theme" })
-- obtém o novo arquivo de textura atribuído à textura com id 'theme'
print(go.get("#gui", "textures", { key = "theme" })) -- /assets/mytheme.atlas
end
A árvore de recursos em um jogo Defold é estática, então quaisquer dependências necessárias para seus nodes GUI precisam ser adicionadas ao componente. O Outline agrupa todas as dependências por tipo sob “pastas”:

Para adicionar uma nova dependência, arraste-a e solte-a do painel Asset para a visualização do editor.
Como alternativa, clique com o botão direito na raiz “Gui” no Outline e selecione Add ▸ [type] no menu de contexto popup.
Você também pode clicar com o botão direito no ícone da pasta do tipo que deseja adicionar e selecionar Add ▸ [type].
Um componente GUI é construído a partir de um conjunto de nodes. Nodes são elementos simples. Eles podem ser transladados (movidos, escalados e rotacionados) e organizados em hierarquias pai-filho, seja no editor ou em runtime por scripting. Existem os seguintes tipos de node:
Adicione nodes clicando com o botão direito na pasta Nodes e selecionando Add ▸ e então Box, Text, Pie, Template ou ParticleFx.

Você também pode pressionar A e selecionar o tipo que deseja adicionar à GUI.
Cada node tem um conjunto extenso de propriedades que controlam sua aparência:
Manual, você pode alterar o valor. O tamanho define os limites do node e é usado ao fazer picking de entrada. Esse valor pode ser animado por script (saiba mais).Automatic, o editor definirá um tamanho para o node. Se definido como Manual, você pode definir o tamanho por conta própria.gui.pick_node(). Use gui.set_enabled() e gui.is_enabled() para alterar e verificar essa propriedade programaticamente.gui.pick_node(). Use gui.set_visible() e gui.get_visible() para alterar e verificar essa propriedade programaticamente.0 significa sem espaçamento entre linhas. 1 (o padrão) é espaçamento normal entre linhas.Alpha mescla por alpha os valores de pixel do node com o fundo. Isso corresponde ao modo de mesclagem “Normal” em softwares gráficos.Add adiciona os valores de pixel do node ao fundo. Isso corresponde a “Linear dodge” em alguns softwares gráficos.Multiply multiplica os valores de pixel do node com o fundo.Screen multiplica inversamente os valores de pixel do node com o fundo. Isso corresponde ao modo de mesclagem “Screen” em softwares gráficos.Os valores possíveis são Center, North, South, East, West, North West, North East, South West ou South East.

Se você alterar o pivô de um node, o node será movido para que o novo pivô fique na posição do node. Nodes de texto são alinhados de modo que Center define texto centralizado, West define texto alinhado à esquerda e East define texto alinhado à direita.

Os seguintes modos de ancoragem estão disponíveis:
None (tanto para X Anchor quanto para Y Anchor) mantém a posição do node a partir do centro do node pai ou da cena, relativa ao seu tamanho ajustado.Left ou Right (X Anchor) escala a posição horizontal do node para que ele mantenha a posição a partir das bordas esquerda e direita do node pai ou da cena na mesma porcentagem.Top ou Bottom (Y Anchor) escala a posição vertical do node para que ele mantenha a posição a partir das bordas superior e inferior do node pai ou da cena na mesma porcentagem.
Um node criado em uma cena cuja resolução lógica é uma resolução típica de paisagem:

Ajustar a cena a uma tela em retrato faz com que a cena seja esticada. A caixa delimitadora de cada node é esticada de forma semelhante. Porém, ao definir o modo de ajuste, a proporção do conteúdo do node pode ser preservada. Os seguintes modos estão disponíveis:
Fit escala o conteúdo do node para que seja igual à largura ou altura da caixa delimitadora esticada, o que for menor. Em outras palavras, o conteúdo caberá dentro da caixa delimitadora esticada do node.Zoom escala o conteúdo do node para que seja igual à largura ou altura da caixa delimitadora esticada, o que for maior. Em outras palavras, o conteúdo cobrirá totalmente a caixa delimitadora esticada do node.Stretch estica o conteúdo do node para preencher a caixa delimitadora esticada do node.
Se a propriedade de cena GUI Adjust Reference estiver definida como Disabled, essa configuração será ignorada.
None renderiza o node normalmente.Stencil faz os limites do node definirem uma máscara stencil usada para recortar os nodes filhos do node.Consulte o manual de clipping de GUI para detalhes.
A combinação das propriedades Pivot, Anchors e Adjust Mode permite um design de GUIs muito flexível, mas pode ser um pouco difícil entender como tudo funciona sem observar um exemplo concreto. Vamos usar como exemplo este mockup de GUI criado para uma tela 640x1136:

A UI foi criada com X e Y Anchors definidos como None, e o Adjust Mode de cada node foi deixado no valor padrão Fit. O ponto Pivot do painel superior é North, o pivô do painel inferior é South e o ponto Pivot das barras no painel superior está definido como West. O restante dos nodes tem pontos de pivô definidos como Center. Se redimensionarmos a janela para deixá-la mais larga, isto acontece:

Agora, e se quisermos que as barras superior e inferior tenham sempre a mesma largura da tela? Podemos alterar o Adjust Mode dos painéis de fundo cinza no topo e na parte inferior para Stretch:

Isso é melhor. Os painéis de fundo cinza agora sempre serão esticados até a largura da janela, mas as barras no painel superior, assim como as duas caixas na parte inferior, não estão posicionadas corretamente. Se quisermos manter as barras do topo posicionadas à esquerda, precisamos alterar o X Anchor de None para Left:

Isso é exatamente o que queremos para o painel superior. As barras no painel superior já tinham seus pontos Pivot definidos como West, o que significa que elas se posicionarão corretamente com a borda esquerda/oeste das barras (Pivot) ancorada à borda esquerda do painel pai (X Anchor).
Agora, se definirmos o X Anchor como Left para a caixa da esquerda e o X Anchor como Right para a caixa da direita, obtemos o seguinte resultado:

Esse não é exatamente o resultado esperado. As duas caixas deveriam permanecer tão próximas das bordas esquerda e direita quanto as duas barras no painel superior. O motivo é que o ponto Pivot está errado:

Ambas as caixas têm o ponto Pivot definido como Center. Isso significa que, quando a tela fica mais larga, o ponto central (o ponto de pivô) das caixas permanece à mesma distância relativa das bordas. No caso da caixa esquerda, era 17% da borda esquerda com a janela original de 640x1136:

Quando a tela é redimensionada, o ponto central da caixa esquerda permanece à mesma distância de 17% da borda esquerda:

Se alterarmos o ponto Pivot de Center para West na caixa da esquerda e para East na caixa da direita, e reposicionarmos as caixas, obtemos o resultado desejado mesmo quando a tela é redimensionada:

Todos os nodes são renderizados na ordem em que estão listados sob a pasta “Nodes”. O node no topo da lista é desenhado primeiro e, portanto, aparecerá atrás de todos os outros nodes. O último node da lista é desenhado por último, o que significa que aparecerá na frente de todos os outros nodes. Alterar o valor Z de um node não controla sua ordem de desenho; no entanto, se você definir o valor Z fora do intervalo de renderização do seu script de renderização, o node não será mais renderizado na tela. Você pode sobrescrever a ordenação por índice dos nodes com layers (veja abaixo).

Selecione um node e pressione Alt + Up/Down para mover um node para cima ou para baixo e alterar sua ordem de índice.
A ordem de desenho pode ser alterada por 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
Um node se torna filho de outro node ao ser arrastado para cima do node que você deseja que seja o pai. Um node com pai herda a transformação (posição, rotação e escala) aplicada ao pai e relativa ao pivô do pai.

Pais são desenhados antes de seus filhos. Use layers para alterar a ordem de desenho de nodes pai e filho e para otimizar a renderização de nodes (veja abaixo).
Layers oferecem controle detalhado sobre como os nodes são desenhados e podem ser usadas para reduzir o número de draw calls que a engine precisa criar para desenhar uma cena GUI. Quando a engine está prestes a desenhar os nodes de uma cena GUI, ela agrupa os nodes em lotes de draw calls com base nas seguintes condições:
Se um node diferir do anterior em qualquer um desses pontos, ele quebrará o lote e criará outra draw call. Nodes de clipping sempre quebram o lote, e cada escopo de stencil também quebra o lote.
A capacidade de organizar nodes em hierarquias facilita agrupar nodes em unidades gerenciáveis. Mas hierarquias podem quebrar efetivamente a renderização em lote se você misturar diferentes tipos de node:

Quando o pipeline de renderização percorre a lista de nodes, ele é forçado a configurar um lote separado para cada node, porque os tipos são diferentes. No total, esses três botões exigirão seis draw calls.
Ao atribuir layers aos nodes, eles podem ser ordenados de forma diferente, permitindo que o pipeline de renderização agrupe os nodes em menos draw calls. Comece adicionando à cena as layers de que você precisa. Clique com o botão direito no ícone da pasta “Layers” no Outline e selecione Add ▸ Layer. Marque a nova layer e atribua a ela uma propriedade Name na visualização Properties.

Então defina a propriedade Layer de cada node para a layer correspondente. A ordem de desenho das layers tem precedência sobre a ordem indexada normal dos nodes, então definir os nodes box de gráficos dos botões como “graphics” e os nodes de texto dos botões como “text” resultará na seguinte ordem de desenho:
Primeiro, todos os nodes da layer “graphics”, a partir do topo:
Depois, todos os nodes da layer “text”, a partir do topo:
Os nodes agora podem ser agrupados em duas draw calls, em vez de seis. Um grande ganho de desempenho!
Observe que um node filho sem layer definida herdará implicitamente a configuração de layer do node pai. Não definir uma layer em um node implicitamente o adiciona à layer “null”, que é desenhada antes de qualquer outra layer.