Gry związane z tworzeniem TV

Na ekranie telewizora przedstawiono kilka kwestii, które mogą być nowością 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 poziomego

Telewizor jest zawsze w orientacji poziomej: nie można go obrócić, a orientacja pionowa nie jest dostępna. Zaprojektuj swoje gry na telewizor tak, aby wyświetlały się w trybie poziomym.

Automatyczny tryb niskiego opóźnienia

Niektóre ekrany mogą przetwarzać grafiki na później. Ten proces poprawia jakość grafiki, ale może zwiększyć opóźnienie. 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 można użyć okna, aby automatycznie włączyć tryb niskiej latencji lub tryb gry (jeśli są dostępne), prosząc o minimalne przetwarzanie po nagraniu. Jest to szczególnie przydatne w przypadku aplikacji do gier i konferencji wideo, w których przypadku mniejsze opóźnienie jest ważniejsze niż jakość grafiki.

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

Urządzenia wejściowe

Telewizory nie mają interfejsów dotykowych, dlatego jeszcze ważniejsze jest, aby dobrze dostosować elementy sterujące i zadbać o to, aby były intuicyjne i przyjemne w użyciu. Obsługa kontrolerów powoduje też inne problemy, na które należy zwrócić uwagę, takie jak śledzenie wielu kontrolerów i odłączanie ich. Wszystkie aplikacje na telewizory, w tym gry, powinny obsługiwać kontrolery w spójny sposób. 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) lub nowszym możesz określić układy klawiatury za pomocą getKeyCodeForKeyLocation(). Na przykład Twoja gra obsługuje poruszanie się za pomocą klawiszy WASD, ale na klawiaturze AZERTY, na której klawisze A i W znajdują się w innych miejscach, może to nie działać prawidłowo. 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 na klawiaturze AZERTY przycisk keyUp ma wartość KeyEvent.KEYCODE_Z, przycisk keyLeft – KeyEvent.KEYCODE_Q, a przyciski keyDownkeyRight – odpowiednio KeyEvent.KEYCODE_SKeyEvent.KEYCODE_D. Możesz teraz tworzyć moduły obsługi kluczowych zdarzeń dla tych kluczowych kodów i wdrażać oczekiwane działanie.

Plik manifestu

W pliku manifestu Androida gry powinny zawierać pewne specjalne informacje.

Wyświetlanie gry na ekranie głównym

Na ekranie głównym Androida TV gry są wyświetlane w oddzielnym wierszu od zwykłych aplikacji. Aby gra była widoczna na liście gier, w pliku manifestu aplikacji ustaw atrybut android:isGame na "true" w tagu <application> . Na przykład:

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

Zadeklaruj obsługę kontrolerów gier

Kontrolery gier mogą być niedostępne lub nieaktywne dla użytkowników telewizora. Aby poinformować użytkowników, że 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". Jeśli to zrobisz, użytkownicy nie będą mogli zainstalować aplikacji na urządzeniach z telewizorem.

Więcej informacji o wpisach 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, musisz wziąć pod uwagę kilka kwestii dotyczących osiągnięć, logowania i zapisywania gier.

Osiągnięcia

Gra powinna zawierać co najmniej 5 (możliwych do zdobycia) osiągnięć. Tylko użytkownik, który steruje rozgrywką za pomocą obsługiwanego urządzenia wejściowego, powinien mieć możliwość zdobywania osiągnięć. Więcej informacji o osiągnięciach i sposobach ich implementowania znajdziesz w artykule Osiągnięcia na Androidzie.

Zaloguj się

Gra powinna próbować zalogować użytkownika po uruchomieniu. Jeśli gracz odmówi zalogowania się kilka razy z rzędu, gra nie będzie już tego robić. Więcej informacji o logowaniu się znajdziesz w artykule Wdrażanie logowania na Androidzie.

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 Settings w grze. Szczegółowe informacje o wdrażaniu zapisanych gier za pomocą Usług Play znajdziesz w artykule Zapisywanie gier na Androidzie.

Zakończ

Dodaj spójny i wyraźny element interfejsu, który umożliwia użytkownikowi płynne wyjście z gry. Ten element powinien być dostępny za pomocą przycisków nawigacyjnych. 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 zezwalaj na przeglądanie internetu w grach na Androida TV. Android TV nie obsługuje przeglądarki internetowej.

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

Sieć

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