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