Gry związane z tworzeniem TV

Na ekranie telewizora znajdziesz kilka kwestii, które mogą być nowością dla deweloperów gier mobilnych. Dotyczy to dużych rozmiarów, schematu sterowania i tego, że wszyscy gracze 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 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 wyświetlacze mogą przeprowadzić dodatkowe przetwarzanie grafiki. Ten proces poprawia jakość grafiki, 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, wyłączając to post-processing. 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 zażądać automatycznego trybu niskiej latencji lub trybu gry (jeśli są dostępne), prosząc o minimalne przetwarzanie po przesłaniu. Jest to szczególnie przydatne w przypadku aplikacji do gier i konferencji wideo, w których przypadku niskie opóźnienie jest ważniejsze niż możliwie najlepsza grafika.

Aby włączyć lub wyłączyć minimalne przetwarzanie wsteczne, 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 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) 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 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 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 kodów kluczy i wdrażać 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 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> . 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 elementach 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 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ę

Używaj Usług Google Play Zapisanych gier do przechowywania zapisanych stanów 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 powinieneś 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 Zapisywanie gier na Androidzie.

Zakończ

Dodaj spójny i wyraźny element interfejsu, który pozwala użytkownikowi wygodnie zakończyć grę. Ten element powinien być dostępny za pomocą przycisków nawigacyjnych. Zamiast polegać na przycisku ekranu głównego, aby zamknąć aplikację, użyj tego przycisku, ponieważ nie jest ono 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 ethernetowe zamiast Wi-Fi. Aplikacja powinna sprawdzać połączenia zarówno Wi-Fi, jak i Ethernet. 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.