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 lo vean simultáneamente.

Display

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

Compatibilidad con pantalla horizontal

Una TV siempre tiene la misma orientación: no puedes girarla y no existe la orientación vertical. Diseña siempre tus juegos para TV de modo que se muestren en modo horizontal.

Modo automático de baja latencia

Algunas pantallas pueden realizar el procesamiento posterior de los gráficos. Este procesamiento posterior mejora la calidad de los gráficos, pero puede aumentar la latencia. Las pantallas más nuevas compatibles con HDMI 2.1 tienen un modo de latencia baja automática (ALLM), que desactiva el procesamiento posterior para minimizar la latencia. Para obtener más información sobre el ALLM, consulta la especificación 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 latencia baja automática o el modo de juego, si está disponible, mediante una solicitud de procesamiento posterior mínimo. Esto es particularmente útil para 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 como true. No todas las pantallas admiten un posprocesamiento mínimo. Para averiguar si una pantalla en particular lo admite, llama al método Display.isMinimalPostProcessingSupported().

Dispositivos de entrada

Las TVs no tienen interfaces táctiles, por lo que es más importante tener los controles correctos y asegurarte de que los jugadores consideren que usarlos es intuitivo y divertido. Administrar controles también conlleva otros problemas a los que debes prestar atención, como el seguimiento de varios controles y el control de desconexiones con facilidad. Todas las apps para TV, incluidos los juegos, deben manejar los controles de manera coherente. Para obtener más información sobre el uso de los controles de TV, consulta Cómo administrar controles de TV y Cómo administrar controles para juegos, que incluye información específica sobre cómo usar 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 mediante getKeyCodeForKeyLocation(). Por ejemplo, tu juego admite movimiento con las teclas WASD, pero es posible que no funcione correctamente en un teclado AZERTY que tenga las teclas A y W en diferentes ubicaciones. Puedes obtener los códigos de clave para las claves 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, se establece keyUp en KeyEvent.KEYCODE_Z, keyLeft 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 clave para estos códigos de tecla e implementar el comportamiento esperado.

Manifest

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, configura el atributo android:isGame como "true" en la etiqueta <application> del manifiesto de tu 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 no estén activos para los usuarios de un dispositivo de TV. Para informar correctamente a los usuarios que tu juego es compatible con un control de juegos, debes incluir la siguiente entrada en el manifiesto de la app:

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

Nota: Si especificas la compatibilidad con android:hardware:gamepad, no definas el atributo android:required en "true". Si lo haces, los usuarios no podrán instalar tu app en los 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 cómo guardar juegos.

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.

Acceso

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

Función de guardado

Usa Juegos guardados de los Servicios de Google Play para guardar las partidas de tu juego. Tu juego debe vincular las partidas guardadas a una Cuenta de Google específica para que se pueda identificar de manera única, incluso en varios dispositivos: sin importar si el jugador está usando un teléfono celular o una TV, el juego debe poder extraer la información de guardado del juego desde 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 información específica sobre la implementación de juegos guardados con los Servicios de Play, consulta Juegos guardados en Android.

Salir

Proporciona un elemento de 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 es compatible con navegadores web.

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

Redes

Con frecuencia, los juegos necesitan un mayor ancho de banda para proporcionar un rendimiento óptimo, y muchos usuarios prefieren Ethernet en lugar de Wi-Fi para proporcionar ese rendimiento. Tu app debe buscar conexiones Wi-Fi y Ethernet. Si tu app es solo para TV, no necesitas verificar el servicio 3G/LTE como lo harías con una app para dispositivos móviles.