Создавайте телевизионные игры

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

Отображать

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

Поддержка альбомной ориентации дисплея

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

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

Некоторые дисплеи могут выполнять постобработку графики. Эта постобработка улучшает качество графики, но может увеличить задержку. Новые дисплеи, поддерживающие 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, как для мобильного приложения.