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
Silnik Defold udostępnia własny edytor GUI oraz rozbudowane możliwości skryptowe, które są specjalnie dopasowane do tworzenia i implementowania interfejsów użytkownika.
Graficzny interfejs użytkownika w Defold to komponent, który tworzysz, dołączasz do obiektu gry i umieszczasz w kolekcji. Taki komponent ma następujące właściwości:
Komponenty GUI są renderowane niezależnie od widoku gry. Z tego powodu nie są umieszczane w konkretnym miejscu w edytorze kolekcji ani nie mają tam reprezentacji wizualnej. Muszą jednak znajdować się w obiekcie gry, który ma swoje miejsce w kolekcji. Zmiana tego położenia nie ma wpływu na GUI.
Komponenty GUI tworzy się z pliku prototypu sceny GUI, znanego też jako “prefab” lub “blueprint” w innych silnikach. Aby utworzyć nowy komponent GUI, kliknij prawym przyciskiem myszy w panelu Assets i wybierz New ▸ Gui. Wpisz nazwę nowego pliku GUI i naciśnij OK.

Silnik Defold automatycznie otworzy teraz plik w edytorze sceny GUI.

W panelu Outline widać całą zawartość GUI: listę węzłów oraz wszystkie zależności (patrz niżej).
Centralny obszar edycji pokazuje GUI. Pasek narzędzi w prawym górnym rogu obszaru edycji zawiera narzędzia Move, Rotate i Scale oraz selektor layout.

Biały prostokąt pokazuje granice aktualnie wybranego layoutu, o domyślnej szerokości i wysokości ekranu ustawionej w ustawieniach projektu.
Wybranie głównego węzła “Gui” w panelu Outline pokazuje Properties komponentu GUI:
Per Node dostosowuje każdy węzeł względem dostosowanego rozmiaru węzła nadrzędnego albo przeskalowanego ekranu.Disable wyłącza tryb dostosowania węzła. Wymusza to zachowanie przez wszystkie węzły ustawionego rozmiaru.gui.new_texture().W czasie działania można manipulować właściwościami GUI ze skryptu komponentu, korzystając z go.get() i go.set():

go.property("mybigfont", resource.font("/assets/mybig.font"))
function init(self)
-- pobierz plik fontu aktualnie przypisany do fontu o id 'default'
print(go.get("#gui", "fonts", { key = "default" })) -- /builtins/fonts/default.font
-- ustaw font o id 'default' na plik fontu przypisany do właściwości zasobu 'mybigfont'
go.set("#gui", "fonts", self.mybigfont, { key = "default" })
-- pobierz nowy plik fontu przypisany do fontu o id 'default'
print(go.get("#gui", "fonts", { key = "default" })) -- /assets/mybig.font
end

go.property("myeffect", resource.material("/assets/myeffect.material"))
function init(self)
-- pobierz plik materiału aktualnie przypisany do materiału o id 'effect'
print(go.get("#gui", "materials", { key = "effect" })) -- /effect.material
-- ustaw materiał o id 'effect' na plik materiału przypisany do właściwości zasobu 'myeffect'
go.set("#gui", "materials", self.myeffect, { key = "effect" })
-- pobierz nowy plik materiału przypisany do materiału o id 'effect'
print(go.get("#gui", "materials", { key = "effect" })) -- /assets/myeffect.material
end

go.property("mytheme", resource.atlas("/assets/mytheme.atlas"))
function init(self)
-- pobierz plik tekstury aktualnie przypisany do tekstury o id 'theme'
print(go.get("#gui", "textures", { key = "theme" })) -- /theme.atlas
-- ustaw teksturę o id 'theme' na plik tekstury przypisany do właściwości zasobu 'mytheme'
go.set("#gui", "textures", self.mytheme, { key = "theme" })
-- pobierz nowy plik tekstury przypisany do tekstury o id 'theme'
print(go.get("#gui", "textures", { key = "theme" })) -- /assets/mytheme.atlas
end
Drzewo zasobów w grze Defold jest statyczne, więc wszystkie zależności potrzebne węzłom GUI trzeba dodać do komponentu. Outline grupuje wszystkie zależności według typu w “folderach”:

Aby dodać nową zależność, przeciągnij ją z panelu Asset do widoku edytora.
Alternatywnie, kliknij prawym przyciskiem myszy główny węzeł “Gui” w panelu Outline, a następnie wybierz Add ▸ [type] z menu kontekstowego.
Możesz też kliknąć prawym przyciskiem myszy ikonę folderu dla typu, który chcesz dodać, i wybrać Add ▸ [type].
Komponent GUI składa się z zestawu węzłów. Węzły są prostymi elementami. Można je przemieszczać, skalować i obracać oraz układać w hierarchie rodzic-dziecko zarówno w edytorze, jak i w czasie działania, korzystając ze skryptów. Dostępne są następujące typy węzłów:
Węzły można dodawać, klikając prawym przyciskiem myszy folder Nodes i wybierając Add ▸, a potem Box, Text, Pie, Template lub ParticleFx.

Możesz też nacisnąć A i wybrać typ, który chcesz dodać do GUI.
Każdy węzeł ma rozbudowany zestaw właściwości, które kontrolują jego wygląd:
Manual, możesz go zmienić. Rozmiar definiuje granice węzła i jest używany przy sprawdzaniu trafień wejścia. Tę wartość można animować ze skryptu (dowiedz się więcej).Automatic, edytor nada węzłowi rozmiar. Jeśli ustawiono Manual, możesz ustawić rozmiar samodzielnie.gui.pick_node(). Użyj gui.set_enabled() i gui.is_enabled(), aby programowo zmieniać i sprawdzać tę właściwość.gui.pick_node(). Użyj gui.set_visible() i gui.get_visible(), aby programowo zmieniać i sprawdzać tę właściwość.0 oznacza brak odstępu między wierszami. 1 (domyślna) oznacza normalny odstęp między wierszami.Alpha miesza wartości pikseli węzła z tłem. Odpowiada to trybowi “Normal” w programach graficznych.Add dodaje wartości pikseli węzła do tła. Odpowiada to trybowi “Linear dodge” w niektórych programach graficznych.Multiply mnoży wartości pikseli węzła przez tło.Screen mnoży odwrotnie wartości pikseli węzła i tła. Odpowiada to trybowi “Screen” w programach graficznych.Dostępne wartości to Center, North, South, East, West, North West, North East, South West albo South East.

Jeśli zmienisz pivot węzła, węzeł zostanie przesunięty tak, aby nowy pivot znalazł się w jego pozycji. Węzły tekstowe są wyrównywane tak, że Center centruje tekst, West wyrównuje go do lewej, a East wyrównuje go do prawej.

Dostępne są następujące tryby kotwiczenia:
None (zarówno dla X Anchor, jak i Y Anchor) zachowuje pozycję węzła względem środka węzła nadrzędnego albo sceny, w odniesieniu do jego dostosowanego rozmiaru.Left albo Right (X Anchor) skaluje poziomą pozycję węzła tak, aby zachować ją w tej samej proporcji względem lewego i prawego brzegu węzła nadrzędnego albo sceny.Top albo Bottom (Y Anchor) skaluje pionową pozycję węzła tak, aby zachować ją w tej samej proporcji względem górnego i dolnego brzegu węzła nadrzędnego albo sceny.
Węzeł utworzony w scenie, w której logiczna rozdzielczość odpowiada typowej rozdzielczości poziomej:

Dopasowanie sceny do ekranu pionowego powoduje rozciągnięcie sceny. Podobnie rozciągana jest ramka ograniczająca każdego węzła. Ustawiając tryb dostosowania, można jednak zachować proporcje zawartości węzła. Dostępne są następujące tryby:
Fit skaluje zawartość węzła tak, aby odpowiadała rozciągniętej szerokości albo wysokości ramki ograniczającej, zależnie od tego, która z nich jest mniejsza. Innymi słowy, zawartość zmieści się wewnątrz rozciągniętej ramki ograniczającej węzła.Zoom skaluje zawartość węzła tak, aby odpowiadała rozciągniętej szerokości albo wysokości ramki ograniczającej, zależnie od tego, która z nich jest większa. Innymi słowy, zawartość całkowicie pokryje rozciągniętą ramkę ograniczającą węzła.Stretch rozciąga zawartość węzła tak, aby wypełniła rozciągniętą ramkę ograniczającą węzła.
Jeśli właściwość sceny GUI Adjust Reference ma wartość Disabled, to ustawienie to zostanie zignorowane.
None renderuje węzeł normalnie.Stencil sprawia, że granice węzła definiują maskę szablonu używaną do przycinania jego węzłów potomnych.Szczegóły znajdziesz w instrukcji przycinania GUI.
Połączenie właściwości Pivot, Anchors i Adjust Mode pozwala bardzo elastycznie projektować GUI, ale bez konkretnego przykładu może być trudno zrozumieć, jak to działa. Weźmy jako przykład taki podgląd GUI utworzony dla ekranu 640x1136:

Interfejs użytkownika został utworzony z X i Y Anchors ustawionymi na None, a Adjust Mode każdego węzła pozostawiono na domyślnym Fit. Pivot górnego panelu to North, pivot dolnego panelu to South, a pivot pasków w górnym panelu ustawiono na West. Pozostałe węzły mają pivot ustawiony na Center. Jeśli zmienimy rozmiar okna tak, aby było szersze, stanie się to:

A co, jeśli chcemy, aby górny i dolny pasek zawsze były tak szerokie jak ekran? Możemy zmienić Adjust Mode szarych paneli tła u góry i u dołu na Stretch:

To lepiej. Szare panele tła będą teraz zawsze rozciągane do szerokości okna, ale paski w górnym panelu oraz dwa pola na dole nie są poprawnie ustawione. Jeśli chcemy, aby paski u góry pozostały po lewej stronie, musimy zmienić X Anchor z None na Left:

To dokładnie to, czego chcemy w przypadku górnego panelu. Paski w górnym panelu miały już ustawiony pivot West, co oznacza, że będą ładnie pozycjonowane tak, aby lewy/zachodni brzeg pasków był zakotwiczony do lewego brzegu panelu nadrzędnego (X Anchor).
Jeśli teraz ustawimy X Anchor na Left dla lewego pola i na Right dla prawego pola, otrzymamy następujący wynik:

To nie jest do końca oczekiwany rezultat. Oba pola powinny pozostać tak blisko lewego i prawego brzegu, jak paski w górnym panelu. Powodem jest nieprawidłowo ustawiony pivot:

Oba pola mają ustawiony pivot Center. Oznacza to, że gdy ekran staje się szerszy, środkowy punkt (pivot) pól pozostaje w tej samej względnej odległości od brzegów. W przypadku lewego pola wynosiło to 17% od lewego brzegu w oryginalnym oknie 640x1136:

Gdy ekran zostaje przeskalowany, środkowy punkt lewego pola pozostaje w tej samej odległości 17% od lewego brzegu:

Jeśli zmienimy pivot z Center na West dla lewego pola i na East dla prawego pola, a następnie przestawimy pola, otrzymamy oczekiwany rezultat nawet po zmianie rozmiaru ekranu:

Wszystkie węzły są renderowane w kolejności, w jakiej są wymienione w folderze “Nodes”. Węzeł na górze listy jest rysowany jako pierwszy i dlatego będzie widoczny za wszystkimi pozostałymi węzłami. Ostatni węzeł na liście jest rysowany jako ostatni, co oznacza, że będzie widoczny przed wszystkimi innymi węzłami. Zmiana wartości Z węzła nie kontroluje jego kolejności rysowania; jeśli jednak ustawisz wartość Z poza zakresem renderowania skryptu do renderowania, węzeł nie będzie już renderowany na ekranie. Kolejność indeksów węzłów można nadpisać za pomocą warstw (patrz niżej).

Zaznacz węzeł i naciśnij Alt + Up/Down, aby przesunąć go w górę lub w dół i zmienić kolejność indeksów.
Kolejność rysowania można też zmieniać w skrypcie:
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
Węzeł staje się dzieckiem innego węzła przez przeciągnięcie go na węzeł, który ma być jego rodzicem. Węzeł z rodzicem dziedziczy transformację (pozycję, obrót i skalę) zastosowaną do rodzica oraz względem jego pivota.

Rodzice są rysowani przed swoimi dziećmi. Używaj warstw, aby zmieniać kolejność rysowania węzłów rodzica i dziecka oraz optymalizować renderowanie węzłów (patrz niżej).
Warstwy dają precyzyjną kontrolę nad tym, jak rysowane są węzły, i można ich użyć do zmniejszenia liczby wywołań rysowania, które silnik musi utworzyć, aby narysować scenę GUI. Gdy silnik ma narysować węzły sceny GUI, grupuje je w partie wywołań rysowania na podstawie następujących warunków:
Jeśli węzeł różni się od poprzedniego pod którymkolwiek z tych względów, przerwie partię i utworzy kolejne wywołanie rysowania. Węzły przycinające zawsze przerywają partię, a każdy zakres szablonu również przerywa partię.
Możliwość układania węzłów w hierarchie ułatwia grupowanie ich w wygodne jednostki. Hierarchie mogą jednak skutecznie psuć renderowanie partiami, jeśli miesza się różne typy węzłów:

Gdy potok renderowania przechodzi przez listę węzłów, musi utworzyć osobną partię dla każdego węzła, ponieważ typy są różne. W sumie te trzy przyciski będą wymagały sześciu wywołań rysowania.
Przypisując węzłom warstwy, można je uporządkować inaczej, co pozwala potokowi renderowania grupować węzły w mniejszą liczbę wywołań rysowania. Zacznij od dodania potrzebnych warstw do sceny. Kliknij prawym przyciskiem myszy ikonę folderu “Layers” w panelu Outline i wybierz Add ▸ Layer. Zaznacz nową warstwę i przypisz jej właściwość Name w widoku Properties.

Następnie ustaw właściwość Layer każdego węzła na odpowiednią warstwę. Kolejność rysowania warstw ma pierwszeństwo przed zwykłą kolejnością indeksów węzłów, więc ustawienie prostokątnych węzłów przycisków na warstwę “graphics” i tekstowych węzłów przycisków na warstwę “text” da następującą kolejność rysowania:
Najpierw wszystkie węzły w warstwie “graphics”, od góry:
Następnie wszystkie węzły w warstwie “text”, od góry:
Węzły można teraz zgrupować w dwa wywołania rysowania zamiast sześciu. To duży zysk wydajnościowy.
Zwróć uwagę, że węzeł potomny bez ustawionej warstwy dziedziczy niejawnie ustawienie warstwy swojego rodzica. Nieustawienie warstwy na węźle niejawnie dodaje go do warstwy “null”, która jest rysowana przed wszystkimi innymi warstwami.