Cómo crear juegos para TV

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

Pantalla

Los dos aspectos principales a tener en cuenta al desarrollar juegos para la pantalla de TV para una orientación horizontal de tu juego y 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ñar siempre que tus juegos de TV se muestren en modo horizontal.

Modo de latencia baja automático

Algunas pantallas pueden realizar el posprocesamiento de gráficos. Este posprocesamiento mejora los gráficos pero puede aumentar la latencia. Las pantallas más nuevas compatibles con HDMI 2.1 tienen una baja automática modo de latencia (ALLM), que minimiza la latencia desactivando este posprocesamiento. Para más detalles sobre el ALLM, consulta la Especificación de HDMI 2.1. Otra opción pantallas pueden admitir un modo de juego con comportamiento similar.

En Android 11 y versiones posteriores, una ventana puede solicitar ese modo o juego automático de baja latencia modo que se pueda usar, si está disponible, mediante la solicitud de procesamiento posterior mínimo. Esto es particularmente relevante útil para aplicaciones de juegos y videoconferencias, donde la baja latencia es más importante que tener los mejores gráficos posibles.

Para habilitar o inhabilitar el posprocesamiento mínimo, llama Window.setPreferMinimalPostProcessing(), o establecer la configuración preferMinimalPostProcessing a true. No todas las pantallas admiten un posprocesamiento mínimo. para averiguar si un pantalla específica sí lo admite, llama al Display.isMinimalPostProcessingSupported().

Dispositivos de entrada

Las TV no tienen interfaces táctiles, de modo que es más importante desarrollar bien los controles y hacer para garantizar que los jugadores las encuentren de forma intuitiva y divertida. Cómo manejar controladores también presenta otros problemas a los que hay que prestar atención, como el seguimiento controladores, y el manejo de desconexiones con facilidad. Todas las apps para TV, incluidos los juegos, deben manejar controladores de la app de forma coherente. Lee Administrar TV controladores para obtener más información sobre el uso de controladores de TV y Administra los controles para juegos de forma específica información sobre el uso de controles de TV para juegos.

Diseños de teclado

En Android 13 (nivel de API 33) y versiones posteriores, puedes determinar los diseños del 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 distintas ubicaciones. Puedes obtener los códigos para las claves que esperas en determinadas 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 está configurado en KeyEvent.KEYCODE_Q, mientras que keyDown y keyRight están establecidos en KeyEvent.KEYCODE_S y KeyEvent.KEYCODE_D, respectivamente. Ahora puedes crear controladores de eventos clave para estas los códigos clave y también 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, establece la El atributo android:isGame a "true" en el manifiesto de tu app <application> . 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 poder visualizar correctamente informar a los usuarios que tu juego es compatible con 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, no configures la android:required a "true". Si haces esto, los usuarios no podrán instalar la app en TVs.

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, haz lo siguiente: debes tener en cuenta consideraciones con respecto a logros, acceso y partidas guardadas.

Logros

El juego debe incluir al menos cinco logros (que se puedan alcanzar). Solo un usuario que controla una jugabilidad desde un dispositivo de entrada compatible debería poder obtener logros. Para obtener más información 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 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

Guardando

Usa la opción de Juegos guardados de los Servicios de Google Play para almacenar contenido guardar tus juegos. Tu juego debe vincular las partidas guardadas a una Cuenta de Google específica, de modo que que se pueda identificar de manera inequívoca, incluso en varios dispositivos: si el jugador utiliza un teléfono celular o una TV, el 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 de forma local y de los datos almacenados en la nube. Puedes implementar la opción en la pantalla Settings del juego. Para 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. Esta se debe poder acceder a él 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 navegadores web.

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

Redes

A menudo, los juegos necesitan un mayor ancho de banda para proporcionar un rendimiento óptimo, y muchos usuarios prefieren de Ethernet a Wi-Fi para proporcionar ese rendimiento. La app debería buscar tanto la conexión Wi-Fi como la Ethernet. conexiones de red. Si la app es solo para TV, no es necesario que verifiques el servicio 3G/LTE como lo harías. para una aplicación móvil.