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

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

Отображать

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

Поддержка альбомного отображения

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

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

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

Вам также следует предоставить в пользовательском интерфейсе вашей игры опцию, позволяющую игроку удалять данные, хранящиеся локально и в облаке. Вы можете разместить эту опцию на экране Settings игры. Подробные сведения о реализации сохраненных игр с помощью сервисов Play см. в разделе «Сохраненные игры в Android» .

Выход

Обеспечьте последовательный и очевидный элемент пользовательского интерфейса, который позволит пользователю корректно выйти из игры. Этот элемент должен быть доступен с помощью кнопок навигации D-pad. Сделайте это вместо того, чтобы полагаться на кнопку «Домой», чтобы обеспечить выход, поскольку это не является единообразным и надежным на разных контроллерах.

Интернет

Не включайте просмотр веб-страниц в играх для Android TV. Android TV не поддерживает веб-браузер.

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

сеть

Играм часто требуется более высокая пропускная способность для обеспечения оптимальной производительности, и многие пользователи предпочитают Ethernet Wi-Fi, чтобы обеспечить такую ​​производительность. Ваше приложение должно проверять наличие подключений Wi-Fi и Ethernet. Если ваше приложение предназначено только для телевидения, вам не нужно проверять наличие службы 3G/LTE, как в случае с мобильным приложением.