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