Desarrolla juegos para todas las pantallas

Cuando se desarrolla un juego para Android, es importante anticipar la variedad posible de 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 ChromeOS pueden ejecutar un contenedor de Android que muestra tu 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 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 de mano (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 ofrecen 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 (por 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 preservar el estado dentro de una app o un juego, la actividad llama a onSaveInstanceState() antes de reiniciarse y a onRestoreInstanceState() después de reiniciarse de forma predeterminada. Sin embargo, este proceso requiere que la actividad vuelva a cargar 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 ello, 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

Para agregar compatibilidad con 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 y ARM, en un único artefacto. Además, Android App Bundle permite mayores límites de tamaño para tu juego; cada APK base puede 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 permite que estos dispositivos puedan ejecutar instrucciones sin necesidad de traducirlas primero.

Cómo agregar compatibilidad con Vulkan

Si admite 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 maneja tu juego, agrega el atributo android:configChanges a cada elemento <activity> de tu manifiesto que represente una pantalla o una interfaz compleja.

En el siguiente fragmento de código, se indica cómo declarar que tu juego se encarga del tamaño y la orientación de la pantalla, así como de 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:

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

El juego controla manualmente los cambios 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. Si deseas obtener información para diseñar tu juego a fin de que sea más fácil de actualizar, 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 pasado y el objeto Display del administrador de ventanas para determinar los valores actualizados del 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 del tamaño y la 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();
}

Ten en cuenta que, cuando cambias la posición de un dispositivo plegable, se cambia la configuración, incluso si tu app se ejecuta en modo de pantalla completa. Como resultado, es posible que tu app deba controlar los cambios en el tamaño de la pantalla o la densidad de píxeles si el usuario pliega o despliega el dispositivo durante la ejecución del juego.

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 ChromeOS, las apps y los juegos de Android se pueden configurar en modo ventana y se puede cambiar de tamaño de forma predeterminada. Si el juego siempre debe ejecutarse en el modo de pantalla completa, puedes establecer el atributo android:resizeableActivity como 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 establecer el atributo android:resizeableActivity como 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, es mejor que agregues este atributo solo como solución temporal con 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 especificar 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.

Proporción

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

  • Orienta tu juego a Android 8.0 (nivel de API 26) o una versión posterior.
  • Permite cambiar el tamaño de la interfaz y la escena de tu juego. Establece android:resizeableActivity como true en dispositivos con Android 7.0 (nivel de API 24) y versiones posteriores.
  • Declara una proporción de aspecto máxima compatible. En un atributo <meta-data> asociado con tu juego, establece 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 pantallas divididas, pantalla en pantalla y áreas de visualización grandes. Cuando se usa uno de estos diseños, el sistema puede mostrar varias actividades al mismo tiempo.

En dispositivos que ejecutan Android 9 (API nivel 28) o versiones posteriores, es posible reanudar todas las actividades visibles superiores 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 estableces android.allow_multiple_resumed_activities como 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 para configurar el juego a fin que se muestre como parte de una pantalla multiventana en la guía sobre cómo agregar compatibilidad con pantallas multiventana.

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 que sea compatible 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 enfocarte 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() al 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, ten en cuenta 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 también 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 para agregar compatibilidad con la entrada del teclado en el juego en la guía para agregar compatibilidad con la navegación del teclado y la guía para controlar las acciones del teclado.

Control de juegos

Si deseas obtener más información para gestionar la entrada del control en tu juego, consulta la guía para 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, debes 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 (nivel de API 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().

Si deseas obtener información adicional para agregar compatibilidad con entradas de mouse y panel táctil en tu juego, consulta la guía para realizar el seguimiento de movimientos táctiles y de puntero y la guía para 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, puedes actualizar 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 de prueba de juegos, 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: