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
Ta strona zawiera przydatny przewodnik i listę kontrolną rzeczy, które warto wziąć pod uwagę podczas wydawania gry albo portowania jej na nową platformę.
Portowanie gry Defold na nową platformę lub pierwsze wydanie zwykle jest prostym procesem. W teorii wystarczy upewnić się, że odpowiednie sekcje są skonfigurowane w pliku game.project, ale aby w pełni wykorzystać możliwości każdej platformy, zaleca się dostosowanie gry do jej specyfiki.
Upewnij się, że gra jest dostosowana do metod wprowadzania danych dostępnych na danej platformie. Rozważ dodanie obsługi gamepadów, jeśli platforma je wspiera. Upewnij się też, że gra obsługuje menu pauzy - jeśli kontroler nagle się odłączy, gra powinna zostać wstrzymana.
Przetłumacz cały tekst występujący w grze. Przy wydaniu w Europie i obu Amerykach rozważ tłumaczenie przynajmniej na EFIGS (ang. English, French, Italian, German and Spanish, czyli angielski, francuski, włoski, niemiecki i hiszpański). Upewnij się, że można łatwo przełączać języki w samej grze, na przykład z poziomu menu pauzy.
Tylko iOS - Upewnij się, że w game.project określisz Localizations, ponieważ sys.get_info() nigdy nie zwróci języka, którego nie ma na tej liście.
Przetłumacz też tekst widoczny na stronie sklepu, ponieważ pozytywnie wpływa to na sprzedaż. Niektóre platformy wymagają, aby tekst na stronie sklepu był przetłumaczony na język każdego kraju, w którym gra jest dostępna.
Upewnij się, że Twoja gra wyróżnia się na tle konkurencji. Ikona często jest pierwszym punktem kontaktu z potencjalnymi graczami. Powinna być łatwa do znalezienia na stronie pełnej ikon gier.
Użyj wyrazistej, przyciągającej wzrok oprawy graficznej. Warto rozważyć wydanie pieniędzy na współpracę z grafikiem, który przygotuje ilustracje przyciągające graczy.
Zapisy gry i inny zapisany stan można przechowywać za pomocą funkcji API w Defold sys.save(filename, data) i wczytywać funkcją sys.load(filename). Funkcja sys.get_save_file(application_id, name) pozwala uzyskać ścieżkę do lokalizacji zależnej od systemu operacyjnego, w której można zapisywać pliki, zwykle w folderze domowym zalogowanego użytkownika.
Używanie sys.get_save_file() i sys.save() działa dobrze na większości platform, ale na konsolach zaleca się inne podejście. Platformy konsolowe zwykle przypisują użytkownika do każdego podłączonego kontrolera, więc zapisy gry, osiągnięcia i inne funkcje powinny być powiązane z odpowiednim użytkownikiem.
Zdarzenia wejściowe z gamepada będą zawierały identyfikator użytkownika, który można wykorzystać do powiązania działań kontrolera z użytkownikiem na konsoli.
Platformy konsolowe i ich rozszerzenia natywne udostępniają platformowo zależne funkcje API do zapisywania i wczytywania danych powiązanych z konkretnym użytkownikiem. Korzystaj z tych interfejsów podczas zapisywania i wczytywania na konsoli.
Interfejsy API platform konsolowych do operacji na plikach są zwykle asynchroniczne. Podczas tworzenia gry wieloplatformowej, przeznaczonej na konsole, zaleca się zaprojektowanie gry tak, aby wszystkie operacje na plikach były asynchroniczne, niezależnie od platformy. Przykład:
local function save_game(data, user_id, cb)
if console then
local filename = "savegame"
consoleapi.save(user_id, filename, data, cb)
else
local filename = sys.get_save_file("mygame", "savegame" .. user_id)
local success = sys.save(filename, data)
cb(success)
end
end
Upewnij się, że wygenerujesz symbole debugowania dla każdej wydanej wersji, aby móc debugować awarie. Przechowuj je razem z pakietem aplikacji.
Przeczytaj instrukcję optymalizacji, aby dowiedzieć się, jak optymalizować aplikację pod kątem wydajności, rozmiaru, zużycia pamięci i energii baterii.
Zawsze testuj na docelowym sprzęcie. Sprawdź wydajność gry i zoptymalizuj ją, jeśli to potrzebne. Użyj profilera, aby znaleźć wąskie gardła w kodzie.
W przypadku platform o stałej orientacji i stałej rozdzielczości ekranu sprawdź, czy gra działa poprawnie przy docelowej rozdzielczości i proporcjach obrazu. W przypadku platform o zmiennej rozdzielczości i zmiennych proporcjach obrazu sprawdź, czy gra działa poprawnie przy różnych rozdzielczościach i proporcjach. Weź też pod uwagę, jaki rodzaj projekcji widoku jest używany w skryptach do renderowania i kamerze.
Na platformach mobilnych albo zablokuj orientację ekranu w game.project, albo upewnij się, że gra działa zarówno w trybie poziomym, jak i pionowym.
Coraz popularniejsze staje się stosowanie niewielkiego wycięcia w ekranie na przednią kamerę i czujniki, nazywanego też notchem albo hole punch camera. Podczas portowania gry na urządzenia mobilne zadbaj, aby ważne informacje mieściły się w bezpiecznym obszarze platformy.
Defold ma wbudowaną obsługę bezpiecznego obszaru w Androidzie i iOS. Ustaw gui.safe_area_mode w pliku game.project, aby określić, które przeciwległe marginesy bezpiecznego obszaru wpływają na dostosowanie GUI. none jest ustawieniem domyślnym i ignoruje marginesy; long stosuje lewy i prawy w orientacji poziomej oraz górny i dolny w pionowej; short stosuje przeciwną parę; a both stosuje wszystkie cztery krawędzie. Skrypt GUI może zastąpić tryb całego projektu dla swojej sceny za pomocą gui.set_safe_area_mode(). Dla własnej logiki GUI lub renderowania funkcja window.get_safe_area() zwraca bezpieczny prostokąt i marginesy poszczególnych krawędzi. Platformy bez wbudowanych marginesów bezpiecznego obszaru zwracają całe okno i zerowe marginesy.
Rozszerzenie Safe Area pozostaje alternatywą dla starszych projektów lub przepływów pracy wymagających zachowania wykraczającego poza wbudowane API; nie jest wymagane do standardowej obsługi bezpiecznego obszaru w Androidzie i iOS.
window.get_reserved_areas() zwraca poszczególne obszary zasłaniające okno gry, takie jak wycięcia na kamerę i Dynamic Island. Używaj tych prostokątów do rozmieszczania zawartości wokół pojedynczych przeszkód. Używaj window.get_safe_area(), gdy potrzebujesz jednego bezpiecznego prostokąta układu i jego wcięć przy krawędziach.
Wynikiem jest tablica tabel z polami x, y, width i height. Każdy prostokąt jest przycinany do okna gry. Początek układu znajduje się w lewym dolnym rogu: x oznacza lewą krawędź, a y dolną, w pikselach okna odpowiadających window.get_size(). Współrzędne są niezależne od dopasowania GUI i logicznej rozdzielczości w game.project, więc przed użyciem ich jako pozycji węzłów uwzględnij transformacje GUI.
Obsługiwane platformy:
Funkcja zwraca pustą tabelę na nieobsługiwanych platformach i wersjach systemu lub gdy dla okna nie zgłoszono przeszkód. Pusta tabela nie oznacza, że całe okno jest bezpieczne dla ważnej zawartości: zagięcia, paski systemowe, klawiatury i obszary gestów pozostają poza zakresem tego API. Użyj window.get_safe_area(), aby uzyskać bezpieczny prostokąt platformy.
Pobierz zarezerwowane obszary podczas inicjalizacji i ponownie przy każdym wywołaniu zwrotnym window.WINDOW_EVENT_RESIZED. Po pierwszym zapytaniu zmiany geometrii zarezerwowanych obszarów również wywołują to zdarzenie na obsługiwanych platformach, nawet jeśli rozmiar okna się nie zmienia. Każda zwrócona tabela jest migawką; zapisane tabele nie aktualizują się automatycznie.
W systemie iOS zdarzenie jest również wysyłane po zmianach orientacji i wcięć bezpiecznego obszaru. Obrót poziomy o 180° może przesunąć wycięcie na kamerę lub Dynamic Island na drugą stronę, podczas gdy wymiary okna i wcięcia bezpiecznego obszaru pozostają bez zmian. Odświeżaj geometrię po zdarzeniu, nawet jeśli data.width i data.height są równe poprzednim wartościom.
Poniższy skrypt utrzymuje oba zestawy geometrii w aktualnym stanie:
local function refresh_screen_areas(self)
self.safe_area = window.get_safe_area()
self.reserved_areas = window.get_reserved_areas()
-- Zaktualizuj interfejs, używając nowego bezpiecznego prostokąta i zarezerwowanych obszarów.
end
local function on_window_event(self, event, data)
if event == window.WINDOW_EVENT_RESIZED then
-- Odśwież nawet wtedy, gdy szerokość i wysokość nie uległy zmianie.
refresh_screen_areas(self)
end
end
function init(self)
refresh_screen_areas(self)
window.set_listener(on_window_event)
end
function final(self)
window.set_listener(nil)
end
Jednocześnie można zarejestrować tylko jednego odbiorcę zdarzeń okna. Jeśli gra już go ma, dodaj tę logikę odświeżania do niego. Zastępowanie zapisanej tablicy przy każdym odświeżeniu usuwa też nieaktualne prostokąty, gdy wynik staje się pusty.
Upewnij się, że przechowujesz keystore w bezpiecznym miejscu, aby móc później zaktualizować grę.
Zachowuj kompletny pakiet dla każdej wersji. Te pliki będą potrzebne, jeśli będziesz chciał załatać grę.
Zintegruj kod specyficzny dla platformy - dla Nintendo Switch istnieje osobne rozszerzenie z dodatkowymi funkcjami pomocniczymi, na przykład do wyboru użytkownika.
Wersja Defold dla Nintendo Switch używa Vulkana jako backendu graficznego - upewnij się, że przetestujesz grę z użyciem backendu graficznego Vulkan.
Zintegruj kod specyficzny dla platformy - dla PlayStation®4 istnieje osobne rozszerzenie z dodatkowymi funkcjami pomocniczymi, na przykład do wyboru użytkownika.
Granie w gry webowe na telefonach komórkowych staje się coraz popularniejsze - postaraj się też, aby gra działała dobrze w mobilnej przeglądarce. Ważne jest również, aby pamiętać, że od gier webowych oczekuje się szybkiego ładowania. Upewnij się, że gra jest zoptymalizowana pod kątem rozmiaru. Weź też pod uwagę ogólne wrażenia z ładowania, aby nie tracić graczy niepotrzebnie.
W 2018 roku przeglądarki wprowadziły politykę automatycznego odtwarzania dźwięku, która uniemożliwia grom i innym treściom webowym odtwarzanie dźwięku, dopóki nie nastąpi zdarzenie interakcji użytkownika, takie jak dotknięcie, kliknięcie przycisku czy użycie gamepada. Podczas portowania do HTML5 trzeba to uwzględnić i rozpoczynać odtwarzanie dźwięków oraz muzyki dopiero po pierwszej interakcji użytkownika. Próby odtwarzania dźwięku przed jakąkolwiek interakcją użytkownika zostaną zapisane jako błąd w konsoli deweloperskiej przeglądarki, ale nie wpłyną na działanie gry.
Upewnij się też, że wstrzymasz wszystkie odtwarzane dźwięki, jeśli w grze są wyświetlane reklamy.