Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Desarrolla juegos para todas las pantallas

Cuando se desarrolla un juego para Android, es importante anticipar la variedad de posibles experiencias del jugador y adaptarse a sus necesidades de interacción en tiempo real. Mediante la compatibilidad con diferentes experiencias del usuario, aumentas la flexibilidad del juego y ayudas a expandir su alcance.

A continuación, se muestran diferencias específicas en la experiencia del jugador:

  • Factores de forma de dispositivo: Aunque los teléfonos proporcionan la experiencia tradicional de dispositivos Android, es posible interactuar con juegos en otros factores de forma. Los dispositivos con Sistema operativo Chrome pueden ejecutar un contenedor Android que muestre el juego. Las tablets que pueden ejecutar Android admiten varios niveles de fidelidad. Los dispositivos con Android TV son compatibles con experiencias más envolventes y detalladas. Los jugadores pueden simular un entorno multiventana con una herramienta de extensión de pantalla. Además, cuando usan dispositivos plegables, pueden cambiar el tamaño de la pantalla durante una sesión de juego.
  • Métodos de interacción: Para interactuar, los jugadores pueden tocar la pantalla del dispositivo, pero también usar un mouse, un panel táctil, un teclado o un control. Además, la disponibilidad de las herramientas de extensión de pantalla y los dispositivos plegables les permiten a los jugadores experimentar el juego en una pantalla más grande, lo que posibilita las sesiones de juego más extensas y el uso de interfaces más complejas.
  • Compatibilidad de hardware: Algunos dispositivos con tecnología Android no tienen el hardware típico de los dispositivos portátiles (por ejemplo, cámara posterior, GPS y conexión de red). Tu juego debe adaptarse al hardware disponible y funcionar de forma adecuada en situaciones en las que determinadas funciones no están disponibles.

En esta guía, se presentan las prácticas recomendadas relacionadas con el desarrollo de juegos para diferentes tipos de pantallas y de interacciones del usuario. También se proporcionan sugerencias sobre el diseño del juego y el desarrollo de una estrategia de prueba eficaz.

Prácticas recomendadas para el diseño de juegos

Cuando planifiques el diseño y la arquitectura de tu juego, sigue las prácticas recomendadas que se describen en las siguientes secciones.

Responde a los cambios de configuración de forma manual

Cuando el sistema Android detecta un cambio en la configuración (o ejemplo en la orientación o el tamaño de la pantalla, o el método de entrada), el sistema reinicia la actividad del momento de forma predeterminada. Para conservar el estado dentro de una app o un juego, la actividad llama de forma predeterminada a onSaveInstanceState() antes de reiniciarse y a onRestoreInstanceState() después de reiniciarse. Sin embargo, este proceso requiere que la actividad recargue todos los servicios y recursos asociados. Para obtener más información sobre este comportamiento predeterminado, consulta la guía sobre cómo controlar los cambios de configuración.

Una sesión de juego típica pasa por varios cambios de configuración. Si el juego permite que el sistema controle todos los cambios de configuración, el escenario del juego se destruye y se reinicia una y otra vez; de este modo, se reduce el rendimiento del juego. Por este motivo, te recomendamos controlar por tu cuenta estos cambios de configuración en el juego.

Para obtener información sobre cómo agregar esta lógica de cambio de configuración al juego, consulta la sección sobre cómo crear controles de cambio de configuración personalizados.

Cómo crear una arquitectura flexible

A fin de agregar compatibilidad para tu juego en todos los dispositivos posibles, sigue estas prácticas recomendadas.

  • Implementa Android App Bundles en lugar de APK individuales. Los paquetes Android App Bundle te permiten empaquetar artefactos de diferentes resoluciones y modelos de arquitectura, como x86, ARM, en un único artefacto. Además, Android App Bundle es compatible con límites de tamaño mayores para tu juego; estos APK base pueden tener hasta 150 MB, y el paquete puede pesar muchos gigabytes.
  • Agrega compatibilidad para arquitecturas x86. En este paso, se mejora el rendimiento del juego en los dispositivos que no son compatibles con ARM, ya que estos dispositivos ahora pueden ejecutar instrucciones sin necesidad de traducirlas primero.

Cómo agregar compatibilidad con Vulkan

Al ser compatible con Vulkan, tu juego puede lograr un mayor rendimiento de gráficos. La mayoría de los dispositivos son compatibles con esta API de gráficos.

Cómo crear controles de cambio de configuración personalizados

Para declarar los tipos de cambios de configuración que controla el juego, agrega el atributo android:configChanges a cada elemento <activity> del manifiesto que representa una pantalla o una interfaz compleja.

En el siguiente fragmento de código, se indica cómo declarar que tu juego tiene en cuenta el tamaño y la orientación de la pantalla, así como los cambios del método de entrada:

    <activity ...
        android:configChanges="screenSize|orientation|keyboard|keyboardHidden">
    </activity>
    

Cuando se producen los cambios de configuración declarados, el sistema invoca un método diferente, onConfigurationChanged(). En este método, se agrega lógica para actualizar la IU del juego:

  • Actualiza el factor de escala y la orientación de la pantalla. Ten en cuenta que, por motivos de rendimiento, en ocasiones es mejor ajustar la IU del juego junto con una dimensión.
  • Identifica el método de entrada óptimo que debe usar el jugador.

Cómo controlar cambios en la configuración de pantalla

El juego controla los cambios manuales de la orientación y el tamaño de la pantalla cada vez que incluyes los valores screenSize y orientation, respectivamente, en un atributo android:configChanges. Puedes usar estos nuevos valores para actualizar el contenido de la escena y las áreas de entrada del jugador. Para obtener una guía sobre cómo diseñar tu juego para que sea más fácil actualizarlo, consulta la guía de compatibilidad con diferentes tamaños de pantalla.

En la implementación de onConfigurationChanged() de tu juego, usa el objeto Configuration que se pasó y el objeto Display del administrador de ventanas a fin de determinar los valores cargados para el tamaño y la orientación de la pantalla, respectivamente.

En el siguiente fragmento de código, se muestra cómo obtener los valores actualizados de tamaño y orientación de la pantalla del juego:

Kotlin

    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        val density: Float = resources.displayMetrics.density
        val newScreenWidthPixels = (newConfig.screenWidthDp * density).toInt()
        val newScreenHeightPixels = (newConfig.screenHeightDp * density).toInt()

        // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or
        // Configuration.ORIENTATION_LANDSCAPE.
        val newScreenOrientation: Int = newConfig.orientation

        // Get general rotation; one of: ROTATION_0, ROTATION_90, ROTATION_180,
        // or ROTATION_270.
        val newScreenRotation: Int = windowManager.defaultDisplay.rotation
    }
    

Java

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        float density = getResources().getDisplayMetrics().density;
        int newScreenWidthPixels = (int) (newConfig.screenWidthDp * density);
        int newScreenHeightPixels = (int) (newConfig.screenHeightDp * density);

        // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or
        // Configuration.ORIENTATION_LANDSCAPE.
        int newScreenOrientation = newConfig.orientation;

        // Get general rotation; one of: ROTATION_0, ROTATION_90, ROTATION_180,
        // or ROTATION_270.
        int newScreenRotation = getWindowManager().getDefaultDisplay()
                .getRotation();
    }
    

Características específicas de pantalla para el juego

En las siguientes secciones, se describe cómo ajustar las reacciones del juego a los cambios de tamaño y orientación de la pantalla, según las características del juego:

Modo de pantalla completa

En algunas plataformas, como el Sistema operativo Chrome, el tamaño de las apps y los juegos de Android puede cambiarse o establecerse en modo ventana de forma predeterminada. Si el juego se debe ejecutar siempre en modo de pantalla completa, puedes definir el atributo android:resizeableActivity en false en uno de tus elementos <activity>, como se muestra en el siguiente fragmento de código:

    <activity ...
        android:resizeableActivity="false">
    </activity>
    

También puedes definir el atributo android:resizeableActivity en false para evitar que se realicen cambios de configuración según el tamaño. Sin embargo, a menos que el juego se ejecute siempre en modo de pantalla completa, deberás agregar este atributo solo como solución temporal para fines de prueba.

Orientación de la pantalla

Si el juego depende de que los sensores de un dispositivo tengan una orientación específica, debes definir el valor de android:screenOrientation en la actividad del juego, como se muestra en el siguiente fragmento de código. Esta configuración ayuda a evitar que una escena del juego gire de forma inesperada.

    <activity ...
        android:screenOrientation="landscape">
    </activity>
    

Características de pantalla específicas de dispositivos

En las siguientes secciones, se describe cómo controlar los cambios de configuración de pantalla en función de las características específicas de cada dispositivo.

Relación de aspecto

Algunos dispositivos admiten diferentes relaciones de aspecto. Por ejemplo, los dispositivos plegables están diseñados para admitir una relación 21:9 cuando están plegados. Para controlar esta posible variedad, realiza una de las siguientes acciones:

  • Orienta tu juego a Android 8.0 (API nivel 26) o una versión posterior.
  • Permite cambiar el tamaño de la interfaz y la escena de tu juego. Define android:resizeableActivity en true para dispositivos que ejecutan Android 7.0 (API nivel 24) y versiones posteriores.
  • Declara una proporción de aspecto máxima compatible. En un atributo <meta-data> asociado con tu juego, define android.max_aspect en 2.4, como se muestra en el siguiente fragmento de código. Sin embargo, ten en cuenta que las relaciones de aspecto mayores que la que especifiques hacen que el juego se muestre con formato letterbox dentro de una pantalla.

        <application>
        <meta-data android:name="android.max_aspect"
                   android:value="2.4" />
        </application>
        

Varias actividades visibles de forma simultánea

Muchos dispositivos modernos son compatibles con una variedad de diseños de pantalla, como imagen en imagen en pantallas divididas y áreas de visualización grandes. Cuando se usa uno de estos diseños, el sistema puede llevar a cabo varias actividades visibles al mismo tiempo.

En dispositivos que ejecutan Android 9 (API nivel 28) o versiones posteriores, es posible reanudar todas las actividades visibles principales al mismo tiempo. Sin embargo, para que ese comportamiento funcione, tanto el juego como el OEM del dispositivo deben habilitar la funcionalidad. Puedes agregar compatibilidad dentro del juego si configuras android.allow_multiple_resumed_activities en true en el manifiesto del juego, como se muestra en el siguiente fragmento:

    <application>
        <meta-data android:name="android.allow_multiple_resumed_activities"
                   android:value="true" />
    </application>
    

Luego, puedes probar el juego en diferentes dispositivos para ver cuál de ellos proporciona la compatibilidad necesaria con el OEM a fin de que la reanudación múltiple funcione correctamente.

Puedes obtener más información sobre cómo configurar el juego para que se muestre como parte de una pantalla de varias ventanas en la guía sobre cómo agregar compatibilidad con varias ventanas.

Cómo controlar diferentes tipos de modelos de interacción

El juego controla la presencia y disponibilidad del teclado de forma manual cada vez que incluyes los valores keyboard y keyboardHidden, respectivamente, en un atributo android:configChanges. Puedes usar estos valores nuevos para actualizar el método de entrada principal del juego.

Cuando configures el juego para compatibilidad con varios tipos de entradas del usuario, ten en cuenta lo siguiente:

  • Detecta los métodos de entrada en lugar de dispositivos individuales. Te permitirá mejorar con facilidad la experiencia del jugador sin concentrarse demasiado en su dispositivo específico.
  • Incluye el atributo keyboardHidden en tu lista de cambios de configuración controlados de forma manual. De esta manera, el juego puede hacer un seguimiento de cuándo un teclado está físicamente conectado al dispositivo, pero no se puede usar.
  • Determina los métodos de entrada disponibles. Para ello, llama a getInputDeviceIds() en el inicio del juego y después de cada cambio de configuración.

    A menudo, puedes determinar cómo planea interactuar el jugador con el juego en función de su dispositivo de entrada preferido:

    • Para secuencias rápidas de botones, los jugadores suelen usar un teclado o un control de juego.
    • Para realizar gestos más complejos, suelen usar una pantalla táctil o un panel táctil.
    • Para realizar entradas de alta precisión, suelen usar un mouse.

En las siguientes secciones, se detallan las prácticas recomendadas para tipos de dispositivos de entrada específicos.

Teclado

Cuando crees un diseño de teclado para tu juego, considera la manera en la que el jugador navega por una escena determinada, así como la manera en la que interactúa con la configuración del juego.

En general, las teclas WASD y las flechas son mejores para controlar el movimiento de los personajes. También es mejor asignar una tecla determinada a cada acción importante o habilidad que un personaje puede realizar en el juego. A fin de maximizar la experiencia del jugador, considera agregar compatibilidad para vinculación de teclas personalizadas en el juego.

Los jugadores deben poder abrir los menús del juego y navegar por ellos con el teclado. La tecla Esc es una asignación común para pausar una escena y mostrar el menú del juego.

Puedes obtener más información sobre cómo agregar compatibilidad para entrada con el teclado en el juego en la guía sobre cómo agregar compatibilidad para navegación con el teclado y la guía sobre cómo controlar las acciones del teclado.

Control de juegos

Cuando los controles de juego están conectados a dispositivos Android, funcionan como teclados con un diseño especializado. Usa las API InputDevice, KeyEvent y MotionEvent para pasar eventos y nombres de dispositivo, ver asignaciones de teclas y controlar la respuesta táctil.

Para obtener más información sobre cómo gestionar la entrada del control en tu juego, consulta la guía sobre cómo agregar compatibilidad con controles de juego.

Mouse o panel táctil

Si tu juego admite entradas desde un mouse o panel táctil, ten en cuenta que los jugadores usan el dispositivo para otras tareas también. Es importante recordar que, cuando se solicita la captura del puntero, todas las entradas del mouse se dirigen a tu juego. Por lo tanto, una vez que el juego tenga la información que necesita, liberará la captura del puntero para que los jugadores retomen el control estándar del mouse en sus dispositivos.

En dispositivos que ejecutan Android 8.0 (API nivel 26) y versiones posteriores, puedes usar la API de captura del mouse para asistirte con el proceso de captura del puntero. En los juegos que reaccionan a entradas de alta precisión, puedes obtener las coordenadas actuales del puntero llamando a los métodos getX() y getY().

Para obtener información adicional sobre cómo agregar en tu juego compatibilidad con entradas del mouse y del panel táctil, consulta la guía sobre cómo realizar un seguimiento de los movimientos táctiles y del puntero y la guía sobre cómo controlar los gestos multitáctiles.

Prueba tu juego

Antes de lanzar el juego, prueba cómo responde a los cambios de configuración completando los pasos que se describen en las siguientes secciones.

Actualiza tu plan de prueba

Cuando valides la funcionalidad del juego, incluye los siguientes casos de prueba:

  • Minimiza y maximiza la ventana que contiene el juego. (No se aplica si el juego está siempre en modo de pantalla completa).
  • Cambia el tamaño de la pantalla.
  • Cambia la orientación de la pantalla. (No se aplica si el juego tiene una orientación fija).
  • Conecta y desconecta los dispositivos de entrada, como teclados y mouse.
  • Realiza una reanudación múltiple, si el juego lo permite.

Además, actualiza el sistema de control de calidad del juego de modo que puedas optimizarlo para una variedad más amplia de experiencias del jugador.

Para conocer las prácticas recomendadas relacionadas con la prueba de tu juego, consulta la guía de aspectos básicos de prueba.

Usa las herramientas de prueba y depuración

Puedes realizar pruebas con una variedad de herramientas compatibles con la plataforma: