Gry związane z tworzeniem TV

Ekran telewizora przedstawia elementy, które mogą być nowe w świecie gier mobilnych dla programistów. Należą do nich m.in. ich duży rozmiar, schemat sterowania i fakt, którzy oglądają go jednocześnie.

Wyświetlacz

Podczas tworzenia gier na telewizor należy pamiętać o 2 głównych kwestiach: zaprojektowaniu gry pod kątem orientacji poziomej i zapewnieniu obsługi niskiej latencji.

Obsługa wyświetlania poziomego

Telewizor jest zawsze ustawiony bokiem – nie można go obrócić i nie ma orientacji pionowej. Zawsze projektuj aby grać na telewizorze w trybie poziomym.

Automatyczny tryb niskiego opóźnienia

Niektóre wyświetlacze mogą przeprowadzić dodatkowe przetwarzanie grafiki. To rozwiązanie poprawia grafikę ale może zwiększyć opóźnienie. Nowsze wyświetlacze obsługujące HDMI 2.1 mają tryb automatycznego zmniejszania opóźnień (ALLM), który minimalizuje opóźnienia przez wyłączenie tego przetwarzania wstępnego. 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 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 krótki czas opóźnienia jest ważniejszy 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 odpowiednie sterowanie i upewniać się, że gra jest intuicyjna i przyjemna 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 używaniu kontrolerów telewizora znajdziesz w artykule Zarządzanie kontrolerami telewizora, a szczegółowe informacje o używaniu kontrolerów telewizora do gier – w artykule Zarządzanie kontrolerami do gier.

Układy klawiatury

W Androidzie 13 (poziom interfejsu API 33) i nowszych możesz określić układy klawiatury za pomocą 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 klawiaturę AZERTY z klawiszami A i W rozmieszczonymi w różnych miejscach. Możesz pobrać kody dla kluczy oczekiwanych w określonych pozycjach:

KotlinJava
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)
    }
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 ustawienie keyUp ma wartość KeyEvent.KEYCODE_Z w polu keyLeft ustawiono formułę KeyEvent.KEYCODE_Q, a keyDown i keyRight są ustawione na KeyEvent.KEYCODE_S i KeyEvent.KEYCODE_D. Możesz teraz tworzyć moduły obsługi kluczowych zdarzeń dla tych kodów kluczy i wdrażać 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 znajdują się w osobnym rzędzie niż zwykłe aplikacje. 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 do gier

Kontrolery do gier mogą być niedostępne lub niedostępne dla użytkowników telewizorów. Aby informacje poinformuj użytkowników, że Twoja gra obsługuje kontroler do gier, w polu 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 elementach pliku manifestu znajdziesz w artykule Plik manifestu aplikacji.

Usługi gier Google Play

Jeśli gra zawiera Usługi gier Google Play, należy pamiętać o wielu kwestii związanych z osiągnięciami, logowaniem się i zapisywaniem 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 na temat: osiągnięcia i sposób ich wykorzystania 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ę

używać zapisanych gier w Usługach Google Play do przechowywania. zapisu stanu gry. Gra powinna wiązać stany gry z konkretnym kontem Google, aby można było jednoznacznie zidentyfikować je nawet na różnych urządzeniach. Niezależnie od tego, czy gracz używa telefonu czy telewizora, gra powinna być w stanie pobrać informacje o stanie gry z tego samego konta użytkownika.

W interfejsie gry powinna być też dostępna opcja umożliwiająca graczowi usunięcie lokalnie i danych przechowywanych w chmurze. Możesz umieścić tę opcję na ekranie gry Settings. Dla: szczegółowe informacje o implementowaniu zapisanych gier w Usługach 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 polegać na Przycisk ekranu głównego do wyświetlania wyjścia, ponieważ nie jest on spójny i niezawodny 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.

Uwaga: klasy WebView możesz użyć do logowania się, aby: serwisach społecznościowych

Sieć

Gry często wymagają większej przepustowości, aby zapewnić optymalną wydajność, a wielu użytkowników woli łącze Ethernet niż Wi-Fi. Aplikacja powinna sprawdzić połączenie Wi-Fi i Ethernet połączeń. 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.