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
Całe wejście użytkownika jest przechwytywane przez silnik i wysyłane jako akcje do komponentów skryptów oraz komponentów skryptów GUI w obiektach gry, które zdobyły skupienie wejścia (ang. input focus) i implementują funkcję on_input(). Niniejsza instrukcja wyjaśnia, jak skonfigurować wiązania wejścia, aby przechwytywać zdarzenia z urządzeń, oraz jak pisać kod reagujący na te akcje.
System wejścia korzysta z zestawu prostych, ale bardzo elastycznych pojęć, dzięki czemu możesz zarządzać wejściem w sposób najlepiej dopasowany do swojej gry.

Wiązania wejścia to tabela obejmująca cały projekt, która pozwala określić, jak wejście z urządzeń ma być tłumaczone na nazwane akcje przed przekazaniem ich do komponentów skryptów i skryptów GUI. Aby utworzyć nowy plik wiązań wejścia, kliknij prawym przyciskiem myszy lokalizację w widoku Assets i wybierz New... ▸ Input Binding. Aby silnik używał nowego pliku, zmień wpis Game Binding w pliku game.project.

Domyślny plik wiązań wejścia jest automatycznie tworzony w każdym nowym szablonie projektu, więc zwykle nie ma potrzeby tworzenia nowego pliku. Domyślny plik nazywa się “game.input_binding” i znajduje się w folderze “input” w katalogu głównym projektu. Kliknij dwukrotnie ten plik, aby otworzyć go w edytorze:

Aby utworzyć nowe wiązanie, kliknij przycisk + na dole odpowiedniej sekcji typu wyzwalacza. Każdy wpis ma dwa pola:
jump. Pamiętaj, że istnieje znany błąd, przez który wejścia dotykowe nie mogą mieć tych samych nazw akcji co inne wejścia.Istnieje pięć typów wyzwalaczy zależnych od urządzenia, które możesz utworzyć:
Oprócz pięciu rodzajów wyzwalaczy wymienionych powyżej Defold obsługuje także wejście z akcelerometru w natywnych aplikacjach na Android i iOS. Zaznacz pole Use Accelerometer w sekcji Input pliku game.project.
function on_input(self, action_id, action)
if action.acc_x and action.acc_y and action.acc_z then
-- reaguj na dane z akcelerometru
end
end
Aby nasłuchiwać akcji wejścia w komponencie skryptu lub skrypcie GUI, należy wysłać wiadomość acquire_input_focus do obiektu gry, który zawiera ten komponent:
-- każ bieżącemu obiektowi gry (".") przejąć skupienie wejścia
msg.post(".", "acquire_input_focus")
Ta wiadomość nakazuje silnikowi dodać do stosu wejścia komponenty obsługujące wejście w obiektach gry, czyli komponenty skryptów, komponenty GUI oraz pełnomocniki kolekcji. Komponenty obiektu gry trafiają na szczyt stosu wejścia; komponent dodany jako ostatni znajdzie się najwyżej. Jeśli obiekt gry zawiera więcej niż jeden komponent obsługujący wejście, wszystkie zostaną dodane do stosu:

Jeśli obiekt gry, który już przejął skupienie wejścia, zrobi to ponownie, jego komponenty zostaną przeniesione na szczyt stosu.
on_input()
Akcje wejścia są rozsyłane zgodnie ze stosem wejścia, od góry do dołu.

Każdy komponent znajdujący się na stosie, który zawiera funkcję on_input(), będzie miał tę funkcję wywołaną raz dla każdej akcji wejścia w danej klatce, z następującymi argumentami:
selfaction_idactionpressed itd. Szczegóły znajdziesz w opisie on_input().function on_input(self, action_id, action)
if action_id == hash("left") and action.pressed then
-- przesuń w lewo
local pos = go.get_position()
pos.x = pos.x - 100
go.set_position(pos)
elseif action_id == hash("right") and action.pressed then
-- przesuń w prawo
local pos = go.get_position()
pos.x = pos.x + 100
go.set_position(pos)
end
end
Każdy świat gry ładowany dynamicznie przez pełnomocnika kolekcji ma własny stos wejścia. Aby rozsyłanie akcji mogło dotrzeć do stosu wejścia załadowanego świata, komponent pełnomocnika musi znajdować się na stosie wejścia głównego świata. Wszystkie komponenty na stosie załadowanego świata są obsługiwane przed kontynuowaniem rozsyłania w dół głównego stosu:

To częsty błąd: zapomina się wysłać acquire_input_focus do obiektu gry zawierającego komponent pełnomocnika kolekcji. Pominięcie tego kroku uniemożliwia dotarcie wejścia do jakichkolwiek komponentów na stosie wejścia załadowanego świata.
Aby przestać nasłuchiwać akcji wejścia, wyślij wiadomość release_input_focus do obiektu gry. Ta wiadomość usunie komponenty obiektu gry ze stosu wejścia:
-- każ bieżącemu obiektowi gry (".") zwolnić skupienie wejścia
msg.post(".", "release_input_focus")
Funkcja on_input() komponentu może aktywnie decydować, czy akcje mają być przekazywane dalej w stosie, czy nie:
on_input() zwraca false albo nie zwraca niczego, wejście zostanie przekazane do następnego komponentu na stosie wejścia.on_input() zwraca true, wejście zostaje skonsumowane. Żaden komponent niżej w stosie wejścia nie otrzyma tego wejścia. Dotyczy to wszystkich stosów wejścia. Komponent na stosie świata załadowanego przez pełnomocnika może skonsumować wejście i uniemożliwić komponentom na głównym stosie jego odbiór:
Istnieje wiele dobrych zastosowań, w których konsumowanie wejścia zapewnia prosty i skuteczny sposób przekazywania sterowania między różnymi częściami gry. Na przykład wtedy, gdy potrzebujesz wysuwanego menu, które przez chwilę jest jedyną częścią gry nasłuchującą wejścia:

Menu pauzy jest początkowo ukryte (wyłączone), a gdy gracz dotknie elementu HUD “PAUSE”, zostaje włączone:
function on_input(self, action_id, action)
if action_id == hash("mouse_press") and action.pressed then
-- czy gracz nacisnął "PAUSE"?
local pausenode = gui.get_node("pause")
if gui.pick_node(pausenode, action.x, action.y) then
-- poinformuj menu pauzy, żeby przejęło sterowanie
msg.post("pause_menu", "show")
end
end
end

GUI menu pauzy przejmuje skupienie wejścia i konsumuje wejście, uniemożliwiając odbiór wszystkiego poza tym, co jest istotne dla wysuwanego menu:
function on_message(self, message_id, message, sender)
if message_id == hash("show") then
-- pokaż menu pauzy
local node = gui.get_node("pause_menu")
gui.set_enabled(node, true)
-- przejmij skupienie wejścia
msg.post(".", "acquire_input_focus")
end
end
function on_input(self, action_id, action)
if action_id == hash("mouse_press") and action.pressed then
-- wykonaj jakieś działanie...
local resumenode = gui.get_node("resume")
if gui.pick_node(resumenode, action.x, action.y) then
-- ukryj menu pauzy
local node = gui.get_node("pause_menu")
gui.set_enabled(node, false)
-- zwolnij skupienie wejścia
msg.post(".", "release_input_focus")
end
end
-- skonsumuj całe wejście. Cokolwiek znajduje się niżej na stosie wejścia
-- nigdy nie zobaczy tego wejścia, dopóki nie zwolnimy skupienia wejścia.
return true
end