Gry związane z tworzeniem TV

Ekran telewizora przedstawia szereg kwestii, które mogą być nowe dla deweloperów gier mobilnych. Obejmują one duży rozmiar, schemat sterowania i możliwość oglądania go przez wszystkich graczy jednocześnie.

Wyświetlacz

2 główne kwestie, o których należy pamiętać przy tworzeniu gier na telewizory, to projektowanie rozgrywki w orientacji poziomej i zapewnienie obsługi niewielkiego opóźnienia.

Obsługa wyświetlania w orientacji poziomej

Telewizor jest zawsze ustawiony bokiem – nie można go obrócić i nie ma orientacji pionowej. Gry telewizyjne zawsze projektuj tak, aby wyświetlały się w trybie poziomym.

Automatyczny tryb niskiego opóźnienia

Niektóre ekrany mogą przetwarzać grafiki na później. Poprawia to jakość grafiki, ale może wydłużyć czas oczekiwania. Nowsze ekrany obsługujące HDMI 2.1 mają tryb automatycznego niskiego opóźnienia (ALLM), który minimalizuje opóźnienie dzięki wyłączeniu tego przetwarzania końcowego. Więcej informacji o ALLM znajdziesz w specyfikacji HDMI 2.1. Inne ekrany mogą obsługiwać tryb gry w podobnym działaniu.

W Androidzie 11 i nowszych okno może zażądać użycia trybu automatycznego niskiego opóźnienia lub trybu gry (jeśli jest dostępny), żądając minimalnego przetwarzania końcowego. Jest to szczególnie przydatne w przypadku gier i rozmów wideo, w których małe opóźnienie jest ważniejsze niż dobra możliwa grafika.

Aby włączyć lub wyłączyć minimalne przetwarzanie końcowe, wywołaj Window.setPreferMinimalPostProcessing() lub ustaw atrybut preferMinimalPostProcessing okna na true. Nie wszystkie wyświetlacze obsługują minimalną ilość przetwarzania końcowego. Aby sprawdzić, czy dany wyświetlacz go obsługuje, wywołaj metodę Display.isMinimalPostProcessingSupported().

Urządzenia wejściowe

Telewizory nie mają interfejsów dotykowych, dlatego jeszcze ważniejsze jest właściwe sterowanie i zapewnienie graczom intuicyjnej i przyjemnej obsługi. Obsługa kontrolerów wiąże się też z pewnymi problemami, na które trzeba zwrócić uwagę, takimi jak śledzenie kilku kontrolerów i płynna obsługa odłączenia. Wszystkie aplikacje na telewizory, w tym gry, powinny w spójny sposób obsługiwać kontrolery. Więcej informacji o korzystaniu z kontrolerów telewizora znajdziesz w artykule Zarządzanie kontrolerami TV, a z artykułem Obsługa kontrolerów do gier.

Układy klawiatury

W Androidzie 13 (poziom interfejsu API 33) i nowszym możesz określić układy klawiatury za pomocą funkcji getKeyCodeForKeyLocation(). Na przykład Twoja gra umożliwia ruch przy użyciu klawiszy WASD, ale ta funkcja może nie działać prawidłowo na klawiaturze AZERTY, która ma klawisze A i W w różnych lokalizacjach. Możesz pobrać kody klawiszy, których potrzebujesz w określonych pozycjach:

Kotlin

val inputManager: InputManager? = requireActivity().getSystemService()

inputManager?.inputDeviceIds?.map { inputManager.getInputDevice(it) }
    ?.firstOrNull { it.keyboardType == InputDevice.KEYBOARD_TYPE_ALPHABETIC }
    ?.let { inputDevice ->
        keyUp = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_W)
        keyLeft = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_A)
        keyDown = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_S)
        keyRight = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_D)
    }

Java

InputManager inputManager = requireActivity().getSystemService(InputManager.class);
InputDevice inputDevice = Arrays.stream(inputManager.getInputDeviceIds())
        .mapToObj(inputManager::getInputDevice)
        .filter( device -> device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC)
        .filter(Objects::nonNull)
        .findFirst()
        .orElse(null);
if (inputDevice != null) {
    keyUp = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_W);
    keyLeft = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_A);
    keyDown = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_S);
    keyRight = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_D);
}

W tym przykładzie, w przypadku klawiatury AZERTY, keyUp ma wartość KeyEvent.KEYCODE_Z, keyLeft ma wartość KeyEvent.KEYCODE_Q, a keyDown i keyRight są ustawione odpowiednio na KeyEvent.KEYCODE_S i KeyEvent.KEYCODE_D. Możesz teraz tworzyć moduły obsługi kluczowych zdarzeń dla tych kodów kluczy i wdrożyć oczekiwane działanie.

Plik manifestu

Gry powinny zawierać w manifeście Androida kilka specjalnych elementów.

Pokaż grę na ekranie głównym

Gry na ekranie głównym Androida TV wyświetlają się w osobnym rzędzie niż zwykłe aplikacje. Aby Twoja gra pojawiła się na liście gier, ustaw wartość atrybutu android:isGame na "true" w tagu <application> w manifeście aplikacji. Na przykład:

<application
    ...
    android:isGame="true"
    ...
>

Zadeklaruj obsługę kontrolerów do gier

Kontrolery do gier mogą być niedostępne lub niedostępne dla użytkowników telewizorów. Aby właściwie poinformować użytkowników, że Twoja gra obsługuje kontroler do gier, w pliku manifestu aplikacji musisz umieścić ten wpis:

  <uses-feature android:name="android.hardware.gamepad" android:required="false"/>

Uwaga: określając obsługę android:hardware:gamepad, nie ustawiaj wartości "true" atrybutu android:required. Jeśli to zrobisz, użytkownicy nie będą mogli zainstalować Twojej aplikacji na telewizorach.

Więcej informacji o wpisach pliku manifestu znajdziesz w artykule o pliku manifestu aplikacji.

Usługi gier Google Play

Jeśli Twoja gra ma zintegrowane usługi gier Google Play, pamiętaj o kilku kwestiach związanych z osiągnięciami, logowaniem się i zapisywaniem gier.

Osiągnięcia

Gra powinna zawierać co najmniej 5 osiągnięć (możliwych do zdobycia). Osiągnięcia może zdobywać tylko użytkownik kontrolujący rozgrywkę z obsługiwanego urządzenia wejściowego. Więcej informacji o osiągnięciach i sposobie ich wdrażania znajdziesz w artykule Osiągnięcia na Androidzie.

Logowanie

Gra powinna próbować zalogować użytkownika przy uruchomieniu. Jeśli gracz kilka razy z rzędu odrzuci prośbę o zalogowanie się, gra nie powinna już prosić o potwierdzenie. Więcej informacji o logowaniu znajdziesz w artykule Wdrażanie logowania na urządzeniach z Androidem.

Zapisuję

Aby zapisać zapisane gry, użyj zapisanych gier w Usługach Google Play. Gra powinna powiązać zapisy gry z konkretnym kontem Google, aby umożliwiać identyfikację nawet na różnych urządzeniach. Niezależnie od tego, czy gracz korzysta z telefonu czy telewizora, gra powinna mieć możliwość pobrania informacji o zapisanym stanie gry z tego samego konta użytkownika.

Musisz też udostępnić w interfejsie gry opcję umożliwiającą graczowi usuwanie danych lokalnie i przechowywanych w chmurze. Możesz umieścić tę opcję na ekranie gry Settings. Szczegółowe informacje o implementowaniu zapisanych gier za pomocą Usług Google Play znajdziesz w artykule Zapisane gry na Androidzie.

Zakończ

Zadbaj o spójny i wyraźny element interfejsu, dzięki któremu użytkownik może płynnie wyjść z gry. Ten element powinien być dostępny za pomocą przycisków nawigacyjnych na padzie kierunkowym. Zrób to, zamiast używać przycisku ekranu głównego jako wyjścia, ponieważ nie jest to spójne ani niezawodne w przypadku różnych kontrolerów.

Sieć

Nie włączaj przeglądania internetu w grach na Androida TV. Android TV nie obsługuje przeglądarki.

Uwaga: klasy WebView możesz używać do logowania się w usługach mediów społecznościowych.

Sieć

Gry często potrzebują większej przepustowości, aby zapewnić optymalną wydajność, i wielu użytkowników woli korzystać z sieci Ethernet od Wi-Fi, aby zapewnić taką wydajność. Aplikacja powinna sprawdzać połączenia Wi-Fi i ethernetowe. Jeśli aplikacja jest przeznaczona tylko na telewizor, nie musisz sprawdzać dostępności usługi 3G/LTE, jak w przypadku aplikacji mobilnej.