Gry związane z tworzeniem TV

Ekran telewizora stwarza szereg wyzwań, które mogą być nowe dla deweloperów gier mobilnych. Należą do nich duży rozmiar ekranu, schemat sterowania i fakt, że wszyscy gracze oglądają go jednocześnie.

Wyświetlacz

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

Obsługa wyświetlania w orientacji poziomej

Telewizor jest zawsze ustawiony bokiem: nie można go obrócić ani ustawić w orientacji pionowej. Gry na telewizor powinny być zawsze projektowane tak, aby były wyświetlane w orientacji poziomej.

Automatyczny tryb niskiego opóźnienia

Niektóre wyświetlacze mogą wykonywać przetwarzanie końcowe grafiki. Poprawia ono 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 tego przetwarzania końcowego. 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 wersjach okno może zażądać użycia automatycznego trybu niskiego opóźnienia lub trybu gry , jeśli są dostępne, przez 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 Window.setPreferMinimalPostProcessing(), lub ustaw atrybut preferMinimalPostProcessing okna na 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, dlatego jeszcze ważniejsze jest, aby sterowanie było 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. śledzenie wielu kontrolerów i prawidłowe obsługiwanie rozłączeń. Wszystkie aplikacje na telewizor, w tym gry, powinny obsługiwać kontrolery w spójny sposób. Więcej informacji o korzystaniu z kontrolerów telewizyjnych znajdziesz w artykule Zarządzanie kontrolerami telewizyjnymi, a szczegółowe informacje o korzystaniu z kontrolerów telewizyjnych w grach – w artykule Obsługa kontrolerów w grach.

Układy klawiatury

W Androidzie 13 (poziom 33 interfejsu API) i nowszych wersjach 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, która ma klawisze A i W w innych miejscach. Możesz pobrać kody 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 keyUp jest ustawiony na KeyEvent.KEYCODE_Z, keyLeft na KeyEvent.KEYCODE_Q, a keyDown i keyRight odpowiednio na KeyEvent.KEYCODE_S i KeyEvent.KEYCODE_D. Możesz teraz utworzyć moduły obsługi zdarzeń klawiszy dla tych kodów klawiszy i zaimplementować oczekiwane działanie.

Plik manifestu

Istnieją pewne specjalne elementy, które gry powinny zawierać w pliku manifestu Androida.

Wyświetlanie gry na ekranie głównym

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

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

Deklarowanie obsługi kontrolerów gier

Kontrolery gier mogą być niedostępne lub nieaktywne dla użytkowników telewizora. Aby prawidłowo poinformować użytkowników, że Twoja gra obsługuje kontroler do gier, musisz dodać ten wpis do 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". Jeśli to zrobisz, użytkownicy nie będą mogli zainstalować Twojej aplikacji na urządzeniach z Androidem TV.

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

Usługi gier Google Play

Jeśli Twoja gra korzysta z usług gier Google Play, musisz pamiętać o kilku kwestiach dotyczących osiągnięć, logowania i zapisywania gier.

Osiągnięcia

Twoja gra powinna zawierać co najmniej 5 osiągnięć (które można zdobyć). Osiągnięcia powinny być dostępne tylko dla użytkowników, którzy sterują rozgrywką za pomocą obsługiwanego urządzenia wejściowego. Więcej informacji o osiągnięciach i sposobach ich implementacji znajdziesz w artykule Osiągnięcia w Androidzie.

Zaloguj się

Twoja 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 Implementowanie logowania w Androidzie.

Zapisuję

Do przechowywania zapisów gry używaj zapisanych gier w Usługach Google Play. Twoja gra powinna powiązywać zapisy gry z konkretnym kontem Google, aby można je było jednoznacznie identyfikować nawet na różnych urządzeniach. Niezależnie od tego, czy gracz używa telefonu, czy telewizora, gra powinna móc pobierać informacje o zapisie gry z tego samego konta użytkownika.

W interfejsie gry powinna też być opcja umożliwiająca graczowi usunięcie danych przechowywanych lokalnie i w chmurze. Możesz umieścić tę opcję na ekranie Settings gry. Szczegółowe informacje o implementowaniu zapisanych gier za pomocą Usług Google Play znajdziesz w artykule Zapisane gry w Androidzie.

Zakończ

Zapewnij spójny i widoczny element interfejsu, który umożliwi użytkownikowi prawidłowe wyjście z gry. Ten element powinien być dostępny za pomocą przycisków nawigacyjnych na padzie kierunkowym. Zamiast polegać na przycisku Home, który nie jest spójny ani niezawodny na różnych kontrolerach, użyj tego elementu.

Sieć

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

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

Sieci

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