Телевизионный экран представляет ряд соображений, которые могут быть новыми для мобильной игры. разработчики. К таким особенностям относятся большой размер экрана, способ управления и то, что все игроки смотрят на него одновременно.
Экран
При разработке игр для телевизоров необходимо учитывать два основных фактора: горизонтальную ориентацию экрана и поддержку низкой задержки.
Поддержка горизонтального расположения экрана
Телевизор всегда расположен горизонтально. Его нельзя повернуть, и у него нет портретной ориентации. Всегда разрабатывайте игры для телевизоров с горизонтальной ориентацией экрана.
Автоматический режим низкой задержки
Некоторые дисплеи могут выполнять постобработку графики. Постобработка улучшает качество графики, но может увеличить задержку. Новые дисплеи, поддерживающие 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 значение "false", если в вашу игру можно играть с помощью стандартного пульта от телевизора (d-pad). Указывайте значение "true" для свойства android:required, только если для игры требуется контроллер.
Если задать значение android:required="true", в Google Play для Android TV будет показываться значок "Требуется геймпад" и предупреждение перед установкой, но установка на телевизоры не будет заблокирована.
Подробнее о манифесте приложения…
Игровые сервисы Google Play
Если в вашей игре интегрированы игровые сервисы Google Play, вам следует учитывать ряд особенностей, связанных с достижениями, входом в аккаунт и сохранением игр.
Достижения
В игре должно быть не менее пяти достижений, которые можно получить. Достижения должны получать только пользователи, которые управляют игровым процессом с помощью поддерживаемого устройства ввода. Подробнее о достижениях и о том, как их реализовать, можно узнать в статье о достижениях в Android.
Вход
При запуске игры должна выполняться попытка входа пользователя в аккаунт. Если игрок несколько раз подряд отказывается от входа, игра должна перестать предлагать его. Подробнее о том, как реализовать вход в аккаунт на Android…
Сохранение…
Используйте сохраненные игры в сервисах Google Play, чтобы сохранить прогресс. Сохранения должны быть привязаны к определенному аккаунту Google, чтобы их можно было однозначно идентифицировать на разных устройствах. Независимо от того, использует ли игрок телефон или телевизор, игра должна иметь возможность получать информацию о сохранении из одного и того же аккаунта пользователя.
В интерфейсе игры также должна быть предусмотрена возможность удаления данных, хранящихся локально и в облаке. Например, вы можете добавить такую возможность на экран Settings. Подробную информацию о том, как реализовать сохранение игр с помощью сервисов Google Play, можно найти в статье Сохранение игр на Android.
Выйти
Добавьте в интерфейс понятный и заметный элемент, позволяющий пользователю выйти из игры. Этот элемент должен быть доступен с помощью кнопок навигации D-pad. Не полагайтесь на кнопку главного экрана, так как она работает по-разному на разных контроллерах.
Веб
Не включайте браузер в играх для Android TV. Android TV не поддерживает веб-браузеры.
Примечание. Класс WebView можно использовать для входа в социальные сети.
Сети
Для оптимальной работы игр часто требуется большая пропускная способность, и многие пользователи предпочитают Ethernet Wi-Fi. Приложение должно проверять наличие подключения как по Wi-Fi, так и по Ethernet. Если приложение предназначено только для телевизоров, вам не нужно проверять, поддерживает ли оно 3G/LTE, как в случае с мобильными приложениями.