Для разработчиков мобильных игр экран телевизора представляет ряд особенностей, которые могут быть новыми. К ним относятся его большой размер, схема управления и тот факт, что все игроки видят его одновременно.
Отображать
При разработке игр для телевизионных экранов следует помнить о двух главных вещах: о разработке игры для альбомной ориентации и о поддержке низкой задержки.
Поддержка альбомной ориентации экрана
Телевизор всегда стоит боком: его нельзя повернуть, и нет вертикальной ориентации. Всегда разрабатывайте игры для телевизора так, чтобы они отображались в альбомной ориентации.
Автоматический режим низкой задержки
Некоторые дисплеи могут выполнять постобработку графики. Эта постобработка улучшает качество изображения, но может увеличить задержку. Более новые дисплеи, поддерживающие 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 расположены в разных местах. Вы можете получить коды клавиш для тех клавиш, которые вы ожидаете увидеть в определенных позициях:
Котлин
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 Games , вам следует учитывать ряд моментов, касающихся достижений, входа в систему и сохранения игры.
Достижения
В вашей игре должно быть как минимум пять (зарабатываемых) достижений. Зарабатывать достижения должен только пользователь, управляющий игровым процессом с поддерживаемого устройства ввода. Для получения дополнительной информации о достижениях и способах их реализации см. раздел «Достижения в Android» .
Войти
Ваша игра должна пытаться авторизоваться при запуске. Если игрок несколько раз подряд отклоняет запрос на авторизацию, игра должна прекратить его запрашивать. Подробнее об авторизации можно узнать в статье «Реализация авторизации на Android» .
Сбережения
Используйте функцию сохранения игр в Google Play Services для хранения сохранений. Ваша игра должна привязывать сохранения к определенной учетной записи Google, чтобы их можно было однозначно идентифицировать даже на разных устройствах: независимо от того, использует ли игрок телефон или телевизор, игра должна иметь возможность получать информацию о сохранениях из одной и той же учетной записи пользователя.
Также следует предусмотреть в пользовательском интерфейсе игры возможность удаления данных, хранящихся локально и в облаке. Можно разместить эту опцию на экране Settings игры. Подробную информацию о реализации сохранений игр с использованием Play Services см. в разделе « Сохраненные игры в Android» .
Выход
Предоставьте пользователю согласованный и очевидный элемент пользовательского интерфейса, позволяющий корректно выйти из игры. Этот элемент должен быть доступен с помощью кнопок навигации D-pad. Используйте его вместо кнопки Home для выхода, поскольку это не обеспечивает согласованности и надежности на разных контроллерах.
Веб
Не включайте веб-браузер в играх для Android TV. Android TV не поддерживает веб-браузер.
Примечание: Для авторизации в социальных сетях можно использовать класс WebView .
Сетевые технологии
Для оптимальной производительности играм часто требуется большая пропускная способность, и многие пользователи предпочитают Ethernet Wi-Fi. Ваше приложение должно проверять наличие как Wi-Fi, так и Ethernet-подключений. Если ваше приложение предназначено только для телевизора, вам не нужно проверять наличие 3G/LTE-соединения, как это требуется для мобильного приложения.