При разработке мобильных игр для телевизоров нужно учитывать ряд факторов, которые могут быть новыми для вас. К таким особенностям относятся большой размер, схема управления и то, что все игроки видят его одновременно.
Экран
При разработке игр для телевизора необходимо учитывать два основных фактора: горизонтальную ориентацию и низкую задержку.
Поддержка горизонтального расположения экрана
Телевизор всегда расположен горизонтально, его нельзя повернуть. Всегда разрабатывайте игры для телевизоров с поддержкой горизонтальной ориентации экрана.
Автоматический режим низкой задержки
Некоторые дисплеи могут выполнять постобработку графики. Постобработка улучшает качество графики, но может увеличить задержку. В более новых дисплеях с поддержкой HDMI 2.1 есть автоматический режим низкой задержки (ALLM), который минимизирует задержку, отключая постобработку. Подробную информацию об ALLM можно найти в спецификации HDMI 2.1. Другие дисплеи могут поддерживать игровой режим с похожим поведением.
В Android 11 и более поздних версиях окно может запросить использование автоматического режима низкой задержки или игрового режима, если они доступны, запросив минимальную постобработку. Это особенно полезно для игр и приложений для видеоконференций, где низкая задержка важнее, чем максимально качественная графика.
Чтобы включить или отключить минимальную постобработку, вызовите метод Window.setPreferMinimalPostProcessing() или задайте для атрибута preferMinimalPostProcessing окна значение true. Не все дисплеи поддерживают минимальную постобработку. Чтобы узнать, поддерживает ли ее определенный дисплей, вызовите метод Display.isMinimalPostProcessingSupported().
Устройства ввода
У телевизоров нет сенсорного экрана, поэтому особенно важно, чтобы элементы управления были удобными и понятными. При работе с контроллерами также возникают другие проблемы, например необходимость отслеживать несколько контроллеров и корректно обрабатывать их отключение. Все приложения для телевизоров, в том числе игры, должны поддерживать контроллеры. Подробнее о том, как управлять контроллерами телевизора и как использовать контроллеры в играх…
Раскладка клавиатуры
В Android 13 (уровень API 33) и более поздних версиях раскладку клавиатуры можно определить с помощью getKeyCodeForKeyLocation().
Например, в вашей игре для перемещения используются клавиши WASD, но на клавиатуре AZERTY клавиши A и W находятся в других местах, поэтому управление может работать некорректно. Вы можете получить коды клавиш, которые должны быть на определенных позициях:
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); }
В этом примере для клавиатуры AZERTY параметр keyUp имеет значение KeyEvent.KEYCODE_Z, параметр keyLeft – значение KeyEvent.KEYCODE_Q, а параметры keyDown и keyRight – значения KeyEvent.KEYCODE_S и KeyEvent.KEYCODE_D соответственно. Теперь вы можете создавать обработчики ключевых событий для этих кодов клавиш и реализовывать ожидаемое поведение.
Манифест
В манифест Android для игр нужно добавить некоторые специальные элементы.
Как показывать игру на главном экране
Игры и обычные приложения представлены на главном экране Android TV в отдельных рядах.
Чтобы игра появилась в списке игр, задайте для атрибута
android:isGame значение "true" в теге <application>
файла манифеста приложения. Пример:
<application ... android:isGame="true" ... >
Как заявить о поддержке игровых контроллеров
Контроллеры могут быть недоступны или неактивны для пользователей телевизоров. Чтобы правильно сообщить пользователям, что ваша игра поддерживает [игровой] контроллер, добавьте в манифест приложения следующую запись:
<uses-feature android:name="android.hardware.gamepad" android:required="false"/>
Примечание. Если вы указываете поддержку android:hardware:gamepad, не задавайте для атрибута android:required значение "true". В этом случае пользователи не смогут устанавливать ваше приложение на телевизоры.
Подробнее о манифесте приложения…
Игровые сервисы Google Play
Если в вашей игре интегрированы игровые сервисы Google Play, вам следует учитывать ряд особенностей, связанных с достижениями, входом в аккаунт и сохранением игр.
Достижения
В игре должно быть не менее пяти достижений. Достижения должны присуждаться только пользователям, которые управляют игровым процессом с помощью поддерживаемого устройства ввода. Подробнее о достижениях и о том, как их реализовать, можно узнать в статье о достижениях в Android.
Вход
При запуске игры должна выполняться попытка входа пользователя в аккаунт. Если игрок несколько раз подряд отказывается войти в аккаунт, игра должна перестать предлагать ему это. Подробнее о входе в аккаунт на устройстве Android можно узнать в статье о реализации входа в аккаунт.
Сохранение…
Используйте сохраненные игры в сервисах Google Play, чтобы сохранить прогресс. В игре нужно привязать сохранения к определенному аккаунту Google, чтобы их можно было однозначно идентифицировать на разных устройствах. Независимо от того, играет игрок на мобильном телефоне или телевизоре, игра должна получать информацию о сохранениях из одного и того же аккаунта пользователя.
В интерфейсе игры также должна быть возможность удалить данные, хранящиеся на устройстве и в облаке. Например, вы можете разместить эту функцию на экране Settings. Подробнее о том, как реализовать сохранения игр с помощью сервисов Google Play…
Выйти
Предоставьте пользователю возможность выйти из игры, добавив в нее понятный и заметный элемент интерфейса. Этот элемент должен быть доступен с помощью кнопок навигации D-pad. Не полагайтесь на кнопку главного экрана, так как ее поведение может отличаться на разных контроллерах.
Веб
Не включайте в играх для Android TV возможность просмотра веб-страниц. Android TV не поддерживает веб-браузеры.
Примечание. Класс WebView можно использовать для входа в социальные сети.
Сети
Для оптимальной работы игр часто требуется большая пропускная способность, и многие пользователи предпочитают Ethernet Wi-Fi. Приложение должно проверять наличие подключения как по Wi-Fi, так и через Ethernet. Если ваше приложение предназначено только для телевизоров, вам не нужно проверять наличие сети 3G/LTE, как это делается в мобильных приложениях.