Gry związane z tworzeniem TV

Ekran telewizora wiąże się z kilkoma kwestiami, które mogą być nowością dla deweloperów gier mobilnych. Obejmują one duży rozmiar, schemat kontroli oraz fakt, że wszyscy gracze oglądają je w tym samym czasie.

Wyświetlacz

Dwie główne kwestie, o których należy pamiętać podczas tworzenia gier na ekran telewizora, to projektowanie gry w orientacji poziomej i zapewnianie obsługi małych opóźnień.

Obsługa wyświetlacza poziomego

Telewizor jest zawsze obrócony – nie można go obrócić ani nie ma orientacji pionowej. Zawsze projektuj gry telewizyjne w taki sposób, aby wyświetlały się w trybie poziomym.

Automatyczny tryb małego opóźnienia

Niektóre wyświetlacze mogą przetwarzać grafikę. Taka obróbka poprawia jakość grafiki, ale może zwiększyć opóźnienie. Nowsze wyświetlacze obsługujące HDMI 2.1 mają automatyczny tryb małego opóźnienia (ALLM), który zmniejsza opóźnienie przez wyłączenie tej funkcji przetwarzania. Więcej informacji o ALLM znajdziesz w specyfikacji HDMI 2.1. Inne wyświetlacze mogą obsługiwać tryb gry o podobnym działaniu.

W Androidzie 11 i nowszych okno może poprosić o użycie automatycznego trybu gry lub trybu gry (jeśli jest dostępny), żądając minimalnego przetwarzania danych. Jest to szczególnie przydatne w przypadku gier i konferencji wideo, w których małe opóźnienie jest ważniejsze niż najlepszą możliwą grafikę.

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ą obróbkę. Aby sprawdzić, czy dany wyświetlacz ją obsługuje, wywołaj metodę Display.isMinimalPostProcessingSupported().

Urządzenia wejściowe

Telewizory nie mają interfejsów dotykowych, dlatego jeszcze ważniejsze jest zadbanie o prawidłowe sterowanie i zapewnienie użytkownikom intuicyjności i przyjemności w obsłudze. Obsługa kontrolerów wiąże się też z pewnymi problemami, na które trzeba zwrócić uwagę, takimi jak śledzenie wielu kontrolerów i płynne rozłączanie. Wszystkie aplikacje na telewizory, w tym gry, powinny spójnie obsługiwać kontrolery. Więcej informacji o korzystaniu z kontrolerów telewizyjnych znajdziesz w artykule Zarządzanie kontrolerami telewizorów, a w sekcji Obsługa kontrolerów do gier – konkretne informacje o korzystaniu z kontrolerów telewizyjnych w grach.

Układy klawiatury

W Androidzie 13 (poziom interfejsu API 33) i nowszych układy klawiatury możesz określać za pomocą polecenia getKeyCodeForKeyLocation(). Na przykład gra obsługuje ruch przy użyciu klawiszy WASD, ale może nie działać prawidłowo na klawiaturze AZERTY, która ma klawisze A i W w różnych miejscach. Kody klawiszy, których oczekujesz, możesz uzyskać w określonych miejscach:

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 z klawiaturą AZERTY ustawienie keyUp ma wartość KeyEvent.KEYCODE_Z, keyLeftKeyEvent.KEYCODE_Q, a keyDown i keyRight – odpowiednio KeyEvent.KEYCODE_S i KeyEvent.KEYCODE_D. Możesz teraz utworzyć moduły obsługi kluczowych zdarzeń dla tych kodów kluczy i wdrożyć oczekiwane działanie.

Plik manifestu

W pliku manifestu Androida powinny znaleźć się pewne specjalne elementy gry.

Pokaż rozgrywkę na ekranie głównym

Na ekranie głównym Androida TV widać gry w osobnym wierszu od zwykłych aplikacji. Aby gra była widoczna na liście gier, ustaw wartość atrybutu android:isGame na "true" w pliku manifestu aplikacji w tagu <application> . Na przykład:

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

Deklarowanie obsługi kontrolerów do gier

Kontrolery do gier mogą być niedostępne i nieaktywne dla użytkowników telewizora. Aby informować użytkowników o tym, że Twoja gra obsługuje kontroler do gier, w manifeście 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 atrybutu android:required na "true". Jeśli to zrobisz, użytkownicy nie będą mogli instalować Twojej aplikacji na telewizorach.

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

Usługi gier Google Play

Jeśli Twoja gra jest zintegrowana z usługami 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 możliwych do osiągnięcia osiągnięć. Osiągnięcia mogą zdobywać tylko użytkownicy kontrolujący rozgrywkę na obsługiwanym urządzeniu wejściowego. Więcej informacji o osiągnięciach i sposobie ich wdrażania znajdziesz w artykule Osiągnięcia na Androidzie.

Logowanie

Przy uruchamianiu gra powinna próbować zalogować użytkownika. Jeśli gracz odmówi zalogowania kilka razy z rzędu, gra powinna przestać się wyświetlać. Więcej informacji o logowaniu znajdziesz w artykule Wdrażanie logowania na urządzeniach z Androidem.

Zapisuję

Za pomocą Zapisanej gry w Usługach Google Play możesz przechowywać zapisane gry. Zapisane stany gry powinny być powiązane z konkretnym kontem Google, aby można było ją jednoznacznie zidentyfikować nawet na różnych urządzeniach. Gra powinna pobierać informacje o stanie gry z tego samego konta użytkownika bez względu na to, czy używa telefonu czy telewizora.

W interfejsie gry musisz też udostępnić opcję umożliwiającą graczowi usunięcie danych przechowywanych lokalnie i 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, który pozwala użytkownikowi płynnie zamknąć grę. Ten element powinien być dostępny za pomocą przycisków nawigacyjnych na padzie kierunkowym. Zrób to, zamiast korzystać z przycisku strony głównej jako wyjścia, ponieważ nie działa to spójne i niezawodnie w przypadku różnych kontrolerów.

Sieć

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

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ść. Wielu użytkowników woli więc korzystać z sieci Ethernet zamiast Wi-Fi. Aplikacja powinna sprawdzać połączenia Wi-Fi i Ethernet. Jeśli Twoja aplikacja jest przeznaczona tylko na telewizor, nie musisz sprawdzać dostępności usługi 3G/LTE, tak jak w przypadku aplikacji mobilnej.