Как создавать игры для телевизоров

Телевизионный экран представляет ряд соображений, которые могут быть новыми для мобильной игры. разработчики. К ним относятся большой размер экрана, схема управления и то, что все игроки смотрят на него одновременно.

Экран

При разработке игр для телевизора необходимо учитывать два основных фактора: горизонтальную ориентацию экрана и поддержку низкой задержки.

Поддержка горизонтального расположения экрана

Телевизор всегда расположен горизонтально. Его нельзя повернуть, и у него нет портретной ориентации. Игры для телевизоров должны поддерживать горизонтальную ориентацию экрана.

Автоматический режим низкой задержки

Некоторые дисплеи могут выполнять постобработку графики. Такая постобработка улучшает качество графики, но может увеличить задержку. Новые дисплеи, поддерживающие 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). Устанавливайте для свойства android:required значение "true", только если для игры требуется контроллер. Если задать значение android:required="true", в Google Play для Android TV будет показываться значок "Требуется геймпад" и предупреждение перед установкой, но установка на телевизоры не будет заблокирована.

Подробнее о манифесте приложения…

Игровые сервисы 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, как в случае с мобильными приложениями.