Ekran telewizora stwarza wiele nowych wyzwań dla deweloperów gier mobilnych. Obejmują one duży rozmiar, schemat sterowania i fakt, że wszyscy gracze widzą go jednocześnie.
Wyświetlacz
Podczas tworzenia gier na telewizor musisz pamiętać o 2 głównych kwestiach: projektowaniu gry w orientacji poziomej i zapewnieniu obsługi niskiego opóźnienia.
Obsługa wyświetlacza w orientacji poziomej
Telewizor jest zawsze ustawiony poziomo. Nie można go obrócić ani ustawić w 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ę po jej wyrenderowaniu. Przetwarzanie końcowe poprawia jakość grafiki, ale może zwiększyć opóźnienie. Nowsze wyświetlacze obsługujące HDMI 2.1 mają automatyczny tryb 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.
Na Androidzie 11 i nowszych okno może zażądać użycia trybu automatycznego niskiego opóźnienia lub trybu gry (jeśli są dostępne) poprzez zażądanie minimalnego przetwarzania końcowego. Jest to szczególnie przydatne w przypadku gier i aplikacji do wideokonferencji, w których niskie opóźnienie jest ważniejsze niż najlepsza możliwa grafika.
Aby włączyć lub wyłączyć minimalne przetwarzanie końcowe, wywołaj funkcję
Window.setPreferMinimalPostProcessing()
lub ustaw atrybut okna
preferMinimalPostProcessing
na wartość true
. Nie wszystkie wyświetlacze obsługują minimalne przetwarzanie końcowe. Aby sprawdzić, czy dany wyświetlacz je obsługuje, wywołaj metodę Display.isMinimalPostProcessingSupported()
.
Urządzenia wejściowe
Telewizory nie mają interfejsu dotykowego, więc jeszcze ważniejsze jest, aby sterowanie było prawidłowe, a gracze uważali je za intuicyjne i przyjemne w użyciu. Obsługa kontrolerów wiąże się też z innymi problemami, na które należy zwrócić uwagę, np. śledzenie wielu kontrolerów i prawidłowe obsługiwanie rozłączeń. Wszystkie aplikacje telewizyjne, 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 znajdziesz w artykule Obsługa kontrolerów do gier.
Układy klawiatury
W Androidzie 13 (poziom interfejsu API 33) i nowszym możesz określać układy klawiatury za pomocą getKeyCodeForKeyLocation()
.
Na przykład Twoja 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
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 znak keyUp
jest ustawiony na KeyEvent.KEYCODE_Z
, znak keyLeft
na KeyEvent.KEYCODE_Q
, a znaki keyDown
i keyRight
na KeyEvent.KEYCODE_S
i KeyEvent.KEYCODE_D
. Możesz teraz tworzyć procedury obsługi kluczowych zdarzeń dla tych kodów klawiszy i wdrażać oczekiwane działanie.
Plik manifestu
Gry powinny zawierać w pliku manifestu Androida pewne specjalne elementy.
Wyświetlanie gry na ekranie głównym
Na ekranie głównym Androida TV gry są wyświetlane w osobnym wierszu niż zwykłe aplikacje.
Aby Twoja gra pojawiła się na liście gier, ustaw atrybut
android:isGame
na "true"
w tagu
<application>
w pliku manifestu aplikacji. Na 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 urządzeń telewizyjnych. Aby prawidłowo poinformować użytkowników, że Twoja gra obsługuje kontroler, musisz dodać do pliku manifestu aplikacji ten wpis:
<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 TV.
Więcej informacji o wpisach w 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 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 powinny być przyznawane tylko użytkownikom, którzy sterują 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 podczas uruchamiania. Jeśli gracz kilka razy z rzędu odrzuci logowanie, gra powinna przestać o nie prosić. Więcej informacji o logowaniu znajdziesz w artykule Wdrażanie logowania na Androidzie.
Zapisuję
Używaj zapisanych gier w Usługach Google Play do przechowywania zapisów gry. Zapisy gry powinny być powiązane z określonym kontem Google, aby można je było 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 zapisie gry z tego samego konta użytkownika.
W interfejsie gry należy 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 Zapisane gry na Androidzie.
Wyjdź
Zapewnij spójny i wyraźny element interfejsu, który umożliwi użytkownikowi płynne wyjście z gry. Ten element powinien być dostępny za pomocą przycisków nawigacyjnych na padzie kierunkowym. Zamiast polegać na przycisku ekranu głównego, który nie działa spójnie i nie jest niezawodny w przypadku różnych kontrolerów, użyj tej metody.
Sieć
Nie włączaj przeglądania internetu w grach na Androida TV. Android TV nie obsługuje przeglądarki.
Uwaga: możesz użyć klasy WebView
do logowania się w usługach społecznościowych.
Sieć
Gry często wymagają większej przepustowości, aby zapewnić optymalną wydajność, a wielu użytkowników woli korzystać z Ethernetu zamiast Wi-Fi. 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, jak w przypadku aplikacji mobilnej.