Gry związane z tworzeniem TV

Ekran telewizora wiąże się z wieloma kwestiami, które mogą być nowe dla deweloperów gier mobilnych. Te obszary obejmują duży rozmiar, schemat sterowania i fakt, że wszyscy gracze oglądają go jednocześnie.

Wyświetlacz

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

Obsługa ekranu poziomego

Telewizor jest zawsze ustawiony poziomo: nie można go obrócić i nie ma 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ę. To przetwarzanie końcowe poprawia jakość grafiki, ale może zwiększyć opóźnienie. Nowsze wyświetlacze obsługujące HDMI 2.1 mają tryb automatycznego niskiego opóźnienia (ALLM), który minimalizuje opóźnienie przez wyłączenie 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 okno może żądać użycia trybu automatycznego niskiego opóźnienia lub trybu gry (jeśli jest dostępny), prosząc o minimalne przetwarzanie końcowe. Jest to szczególnie przydatne w przypadku gier i aplikacji do prowadzenia rozmów wideo, gdzie 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 dowiedzieć się, 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 elementy sterujące były odpowiednie i intuicyjne dla graczy. Obsługa kontrolerów wiąże się też z innymi problemami, na które należy zwrócić uwagę, takimi jak śledzenie wielu kontrolerów i prawidłowa obsługa rozłączeń. Wszystkie aplikacje TV, 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 (API na poziomie 33) i nowszych układ klawiatury można określić za pomocą getKeyCodeForKeyLocation(). Na przykład 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, których oczekujesz na 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 z klawiaturą AZERTY klawisz keyUp jest ustawiony na KeyEvent.KEYCODE_Z, klawisz keyLeft jest ustawiony na KeyEvent.KEYCODE_Q, a klawisze keyDown i keyRight są ustawione 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 wdrożyć oczekiwane działanie.

Plik manifestu

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

Wyświetlanie gry na ekranie głównym

Na ekranie głównym Androida TV gry wyświetlają się w osobnym wierszu, oddzielnie od zwykłych aplikacji. Aby Twoja gra pojawiała się na liście gier, ustaw atrybut android:isGame na "true" w tagu <application> w pliku manifestu aplikacji. 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 telewizorów. Aby prawidłowo poinformować użytkowników, że Twoja gra obsługuje kontroler do gier, musisz uwzględnić w manifeście aplikacji ten wpis:

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

Uwaga: jeśli określasz obsługę android.hardware.gamepad, ustaw atrybut android:required na "false", jeśli w grę można grać również za pomocą standardowego pilota do telewizora (pad kierunkowy). Ustaw android:required na "true" tylko wtedy, gdy do grania w Twoją grę wymagany jest kontroler do gier. Ustawienie android:required="true" powoduje wyświetlenie plakietki „Wymagany pad do gier” i ostrzeżenia przed instalacją w Google Play na Androidzie TV, zamiast blokować instalację na telewizorach.

Więcej informacji o wpisach w pliku manifestu znajdziesz w artykule Manifest 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 powinien móc zdobywać tylko użytkownik, który steruje rozgrywką za pomocą obsługiwanego urządzenia wejściowego. Więcej informacji o osiągnięciach i sposobach ich wdrażania znajdziesz w artykule Osiągnięcia na Androidzie.

Zaloguj się

Gra powinna próbować zalogować użytkownika przy uruchomieniu. Jeśli gracz kilka razy z rzędu odmówi zalogowania się, gra powinna przestać o to prosić. Więcej informacji o logowaniu znajdziesz w artykule Wdrażanie logowania na Androidzie.

Zapisuję

Używaj Zapisanych gier w usługach Google Play, aby zapisywać stan gry. Gra powinna wiązać zapisane stany gry z konkretnym kontem Google, aby można było je jednoznacznie zidentyfikować na różnych urządzeniach. Niezależnie od tego, czy gracz korzysta z telefonu czy telewizora, gra powinna mieć możliwość pobrania informacji o zapisanych stanach gry z tego samego konta użytkownika.

W interfejsie gry powinna też być dostępna 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 na Androidzie.

Zakończ

Zapewnij spójny i wyraźny element interfejsu, który umożliwia użytkownikowi łatwe wyjście z gry. Ten element powinien być dostępny za pomocą przycisków nawigacyjnych pada kierunkowego. Zrób to, zamiast polegać na przycisku ekranu głównego, ponieważ nie działa on w ten sam sposób na różnych kontrolerach.

Sieć

Nie włączaj przeglądania 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 preferuje połączenie Ethernet zamiast Wi-Fi, aby uzyskać taką wydajność. Aplikacja powinna sprawdzać połączenia Wi-Fi i Ethernet. Jeśli aplikacja jest przeznaczona tylko na telewizory, nie musisz sprawdzać, czy jest dostępna usługa 3G/LTE, tak jak w przypadku aplikacji mobilnej.