Cómo crear juegos para TV

La pantalla de la televisión presenta una serie de consideraciones que pueden ser nuevas para los desarrolladores de juegos para dispositivos móviles. Estas áreas incluyen su gran tamaño, su esquema de control y el hecho de que todos los jugadores la ven de forma simultánea.

Pantalla

Las dos cosas principales que debes tener en cuenta cuando desarrollas juegos para la pantalla de la TV son diseñar tu tu juego para una orientación horizontal y proporcionar compatibilidad con baja latencia.

Compatibilidad con pantalla horizontal

Una TV siempre está de costado: no puedes girarla y no hay orientación vertical. Siempre diseña tus juegos para TV para que se muestren en modo horizontal.

Modo de baja latencia automático

Algunas pantallas pueden realizar el procesamiento posterior de gráficos. Este procesamiento posterior mejora la calidad de los gráficos , pero puede aumentar la latencia. Las pantallas más nuevas que admiten HDMI 2.1 tienen un modo de baja latencia automático (ALLM), que minimiza la latencia desactivando este procesamiento posterior. Para obtener más detalles sobre ALLM, consulta la especificación de HDMI 2.1. Es posible que otras pantallas admitan un modo de juego con un comportamiento similar.

En Android 11 y versiones posteriores, una ventana puede solicitar que se use el modo de baja latencia automático o el modo de juego, si está disponible, solicitando un procesamiento posterior mínimo. Esto es particularmente útil para las aplicaciones de juegos y videoconferencias, en las que la baja latencia es más importante que tener los mejores gráficos posibles.

Para habilitar o inhabilitar el procesamiento posterior mínimo, llama a Window.setPreferMinimalPostProcessing(), o configura el atributo preferMinimalPostProcessing de la ventana en true. No todas las pantallas admiten el procesamiento posterior mínimo. Para saber si una pantalla en particular lo admite, llama al Display.isMinimalPostProcessingSupported() método.

Dispositivos de entrada

Las TVs no tienen interfaces táctiles, por lo que es aún más importante que los controles sean correctos y que los jugadores los encuentren intuitivos y divertidos de usar. El manejo de los controles también presenta otros problemas a los que debes prestar atención, como hacer un seguimiento de varios controles y manejar las desconexiones sin problemas. Todas las apps para TV, incluidos los juegos, deben manejar los controles de manera coherente. Lee Administra los controles de TV para obtener más información sobre el uso de los controles de TV y Administra los controles para juegos para obtener información específica sobre el uso de los controles de TV para juegos.

Diseños de teclado

En Android 13 (nivel de API 33) y versiones posteriores, puedes determinar los diseños de teclado con getKeyCodeForKeyLocation(). Por ejemplo, tu juego admite el movimiento con las teclas WASD, pero es posible que esto no funcione correctamente en un teclado AZERTY que tiene las teclas A y W en diferentes ubicaciones. Puedes obtener los códigos de teclas para las teclas que esperas en ciertas posiciones:

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);
}

En este ejemplo, con un teclado AZERTY, keyUp se establece en KeyEvent.KEYCODE_Z, keyLeft se establece en KeyEvent.KEYCODE_Q, mientras que keyDown y keyRight se establecen en KeyEvent.KEYCODE_S y KeyEvent.KEYCODE_D, respectivamente. Ahora puedes crear controladores de eventos de teclas para estos códigos de teclas y, luego, implementar el comportamiento esperado.

Manifiesto

Hay algunos aspectos especiales que deben incluir los juegos en el manifiesto de Android.

Muestra tu juego en la pantalla principal

La pantalla principal de Android TV muestra los juegos en una fila separada del resto de las apps normales. Para que tu juego aparezca en la lista de juegos, establece el android:isGame atributo en "true" en la etiqueta <application> del manifiesto de la app. Por ejemplo:

<application
    ...
    android:isGame="true"
    ...
>

Declara la compatibilidad con los controles de juegos

Es posible que los controles de juegos no estén disponibles o activos para los usuarios de un dispositivo de TV. Para informar correctamente a los usuarios que tu juego admite un control de juegos, debes incluir la siguiente entrada en el manifiesto de tu app:

  <uses-feature android:name="android.hardware.gamepad" android:required="false"/>

Nota: Cuando especifiques la compatibilidad con android.hardware.gamepad, establece el atributo android:required en "false" si tu juego también se puede jugar con un control remoto de TV estándar (pad direccional). Solo establece android:required en "true" si se requiere un control de juegos para jugar tu juego. Si estableces android:required="true", se muestra una insignia de "Se requiere un control de juegos" y una advertencia previa a la instalación en Google Play para Android TV, en lugar de bloquear la instalación en dispositivos de TV.

Para obtener más información sobre las entradas del manifiesto, consulta Manifiesto de la app.

Servicios de juego de Google Play

Si tu juego integra los Servicios de juego de Google Play, debes tener en cuenta varias consideraciones relacionadas con los logros, el acceso y los juegos guardados.

Logros

El juego debe incluir al menos cinco logros (que se puedan alcanzar). Solo un usuario que controle el juego desde un dispositivo de entrada compatible debería poder obtener logros. Para obtener más información sobre los logros y cómo implementarlos, consulta Logros en Android.

Acceder

El juego debe intentar acceder al perfil del usuario en el lanzamiento. Si el jugador rechaza el acceso varias veces seguidas, el juego debe dejar de preguntar. Obtén más información sobre el acceso en Cómo implementar el acceso en Android.

Guardando

Usa los Juegos guardados de los Servicios de Google Play para almacenar el guardado del juego. El juego debe vincular los guardados del juego a una Cuenta de Google específica para que se pueda identificar de manera inequívoca incluso en diferentes dispositivos. Ya sea que el jugador use un teléfono o una TV, el juego debería poder extraer la información de guardado del juego de la misma cuenta de usuario.

También debes proporcionar una opción en la IU del juego para permitir que el jugador borre los datos almacenados de forma local y en la nube. Puedes implementar la opción en la pantalla Settings del juego. Para obtener detalles sobre la implementación de juegos guardados con los Servicios de Play, consulta Juegos guardados en Android.

Salir

Proporciona un elemento de la IU coherente y obvio que le permita al usuario salir del juego sin problemas. Se debe poder acceder a este elemento con los botones de navegación del pad direccional. Haz esto en lugar de depender del botón de inicio para proporcionar una salida, ya que no es coherente ni confiable en diferentes controles.

Web

No habilites la navegación web en juegos para Android TV. Android TV no admite un navegador web.

Nota: Puedes usar la clase WebView para acceder a los servicios de redes sociales.

Redes

Los juegos suelen necesitar un mayor ancho de banda para proporcionar un rendimiento óptimo, y muchos usuarios prefieren Ethernet a Wi-Fi para proporcionar ese rendimiento. Tu app debe verificar las conexiones Wi-Fi y Ethernet. Si tu app es solo para TV, no necesitas verificar el servicio 3G/LTE como lo harías para una app para dispositivos móviles.