Na ekranie telewizora przedstawiono 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 widzą 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 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 dla klawiszy, które chcesz umieścić 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 keyDown
i keyRight
– odpowiednio 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
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 musisz 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 umożliwia użytkownikowi płynne zakończenie gry. 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. Nie jest to jednak rozwiązanie stałe 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 łącze przewodowe 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.