Gry związane z tworzeniem TV

Ekran telewizora stwarza wiele możliwości, które mogą być nowe dla deweloperów gier mobilnych. Obejmują one duży rozmiar, schemat sterowania i fakt, że wszyscy gracze widzą go jednocześnie.

Wyświetlacz

Podczas tworzenia gier na telewizor musisz pamiętać o 2 głównych kwestiach: projektowaniu gry w orientacji poziomej i zapewnieniu obsługi niskiego opóźnienia.

Obsługa wyświetlacza w orientacji poziomej

Telewizor jest zawsze ustawiony poziomo: nie można go obrócić ani ustawić w orientacji pionowej. Zawsze projektuj gry na telewizor tak, aby wyświetlały się w trybie poziomym.

Automatyczny tryb niskiego opóźnienia

Niektóre wyświetlacze mogą przetwarzać grafikę po jej wyrenderowaniu. Przetwarzanie końcowe poprawia jakość grafiki, ale może zwiększyć opóźnienie. Nowsze wyświetlacze obsługujące HDMI 2.1 mają automatyczny tryb niskiego opóźnienia (ALLM), który minimalizuje opóźnienie przez wyłączenie przetwarzania końcowego. Więcej informacji o trybie ALLM znajdziesz w specyfikacji HDMI 2.1. Inne wyświetlacze mogą obsługiwać tryb gry o podobnym działaniu.

Na Androidzie 11 i nowszym okno może zażądać użycia trybu automatycznego niskiego opóźnienia lub trybu gry, jeśli są dostępne, poprzez zażądanie minimalnego przetwarzania końcowego. Jest to szczególnie przydatne w przypadku gier i aplikacji do wideokonferencji, w których niskie opóźnienie jest ważniejsze niż najlepsza możliwa grafika.

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

Urządzenia wejściowe

Telewizory nie mają interfejsów dotykowych, więc jeszcze ważniejsze jest, aby sterowanie było prawidłowe, a gracze uważali je za intuicyjne i przyjemne w użyciu. Obsługa kontrolerów wiąże się też z innymi problemami, na które trzeba zwrócić uwagę, np. śledzeniem wielu kontrolerów i prawidłową obsługą rozłączeń. Wszystkie aplikacje telewizyjne, w tym gry, powinny obsługiwać kontrolery w spójny sposób. Więcej informacji o używaniu kontrolerów telewizora znajdziesz w artykule Zarządzanie kontrolerami telewizora, a szczegółowe informacje o używaniu kontrolerów telewizora do gier znajdziesz w artykule Obsługa kontrolerów do gier.

Układy klawiatury

W Androidzie 13 (poziom interfejsu API 33) i nowszym możesz określać układy klawiatury za pomocą getKeyCodeForKeyLocation(). Na przykład Twoja gra obsługuje ruch za pomocą klawiszy WASD, ale może to nie działać prawidłowo na klawiaturze AZERTY, na której klawisze A i W znajdują się w innych miejscach. Możesz uzyskać kody klawiszy dla klawiszy, których oczekujesz 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 na klawiaturze AZERTY znak keyUp jest ustawiony na KeyEvent.KEYCODE_Z, znak keyLeft jest ustawiony na KeyEvent.KEYCODE_Q, a znaki keyDownkeyRight są ustawione odpowiednio na KeyEvent.KEYCODE_SKeyEvent.KEYCODE_D. Możesz teraz tworzyć procedury obsługi kluczowych zdarzeń dla tych kodów klawiszy i wdrażać oczekiwane działanie.

Plik manifestu

Gry powinny zawierać w pliku manifestu Androida kilka specjalnych elementów.

Wyświetlanie gry na ekranie głównym

Na ekranie głównym Androida TV gry są wyświetlane w osobnym wierszu niż zwykłe aplikacje. Aby Twoja gra pojawiła się na liście gier, ustaw atrybut android:isGame na "true" w tagu <application> w pliku manifestu aplikacji. Na przykład:

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

Deklarowanie obsługi kontrolerów do gier

Kontrolery do gier mogą być niedostępne lub nieaktywne dla użytkowników urządzeń telewizyjnych. Aby prawidłowo poinformować użytkowników, że Twoja gra obsługuje kontroler do gier, musisz dodać ten wpis do pliku manifestu aplikacji:

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

Uwaga: podczas określania obsługi android:hardware:gamepad nie ustawiaj atrybutu android:required na "true". W takim przypadku użytkownicy nie będą mogli zainstalować aplikacji na urządzeniach TV.

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

Usługi gier Google Play

Jeśli Twoja gra jest zintegrowana z usługami gier Google Play, musisz pamiętać o kilku kwestiach związanych z osiągnięciami, logowaniem i zapisywaniem gier.

Osiągnięcia

Gra powinna zawierać co najmniej 5 osiągnięć (do zdobycia). Osiągnięcia powinny być przyznawane tylko użytkownikom, którzy sterują rozgrywką za pomocą 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.

Zaloguj się

Gra powinna próbować zalogować użytkownika podczas uruchamiania. Jeśli gracz kilka razy z rzędu odrzuci logowanie, gra powinna przestać o nie prosić. Więcej informacji o logowaniu znajdziesz w artykule Wdrażanie logowania na Androidzie.

Zapisuję

Używaj zapisanych gier w Usługach Google Play do przechowywania zapisów gry. Gra powinna wiązać zapisy z określonym kontem Google, aby można było je jednoznacznie zidentyfikować 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 zapisie z tego samego konta użytkownika.

W interfejsie gry należy też udostępnić opcję, która pozwoli graczowi usunąć dane przechowywane lokalnie i w chmurze. Możesz umieścić tę opcję na ekranie Settings w grze. Szczegółowe informacje o wdrażaniu zapisanych gier za pomocą Usług Play znajdziesz w artykule Zapisane gry na Androidzie.

Wyjdź

Zapewnij spójny i wyraźny element interfejsu, który umożliwi użytkownikowi płynne wyjście z gry. Ten element powinien być dostępny za pomocą przycisków nawigacyjnych na padzie kierunkowym. Zamiast polegać na przycisku ekranu głównego, który nie działa spójnie i nie jest niezawodny w przypadku różnych kontrolerów, użyj tej metody.

Sieć

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

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

Sieć

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