Resolución Independencia en libGDX

22

¿Cómo hago que la resolución / densidad de mi juego libGDX sea independiente? ¿Hay alguna manera de especificar los tamaños de imagen como "absolutos" independientemente de la densidad subyacente?

Estoy haciendo un juego para niños muy simple; solo un montón de sprites que se muestran en la pantalla y algo de texto para los menús (menú de opciones principalmente). Lo que quiero saber es: ¿cómo hago que la resolución de mis sprites / fuentes sea independiente? (Los he incluido en mis propias clases para facilitar las cosas).

Como es un juego simple para niños, no necesito preocuparme por el "área jugable" del juego; Quiero usar la mayor cantidad de espacio posible en la pantalla.

Lo que estoy haciendo en este momento, lo que parece súper incorrecto, es simplemente crear imágenes adecuadas para grandes resoluciones y luego reducirlas (o raramente, subirlas) para que se ajusten al tamaño de la pantalla. Esto parece funcionar bien (en la versión de escritorio), incluso con mapeo lineal en mis texturas, pero las resoluciones más pequeñas se ven feas.

Además, esto parece ir en contra de los "píxeles independientes del dispositivo" (DP) de Android. ¿O tal vez me estoy perdiendo algo y libGDX ya se encarga de esto de alguna manera?

¿Cuál es la mejor manera de abordar esto? Encontré este enlace; ¿Es esta una buena forma de resolver el problema ?: http://www.dandeliongamestudio.com/2011/09/12/android-fragmentation-density-independent-pixel-dip/

Menciona cómo controlar las imágenes, pero no menciona cómo especificar los tamaños de fuente / imagen, independientemente de la densidad.

cenizas999
fuente
Posiblemente relacionado? gamedev.stackexchange.com/questions/34/…
thedaian
@thedaian no del todo. Eso se trata de resolución; Me preocupa más la interacción entre densidad y resolución.
cenizas999

Respuestas:

12

Como puede leer la densidad del dispositivo y representar las fuentes durante el tiempo de ejecución en libgdx, utilizo esta solución para lograr un tamaño de fuente independiente de la densidad:

float densityIndependentSize = origFontSize * Gdx.graphics.getDensity();
int fontSize = Math.round(densityIndependentSize );
BitmapFont font = generator.generateFont(fontSize );
Pascalius
fuente
Mi discusión es sobre imágenes y fuentes. Sin embargo, +1 para la representación dinámica de fuentes (ya lo hago).
cenizas999
10

Para lograr esto en libgdx, puede usar la "cámara ortográfica" allí asigna el tamaño que desea usar, y en cada resolución puede ver todas sus imágenes escaladas a ese tamaño (uso el 800X480 porque es la pantalla más grande en Android ) y funciona bien :)

public class GameStage extends Stage 
{ 
     public GameStage(float width, float height, boolean stretch) 
     { 
          this.camera = new OrthographicCamera(800, 480);
          this.camera.position.set(800/2, 480/2, 0f); 
     } 
}
Rudy_TM
fuente
¿Puedo obtener una muestra de código, por favor?
cenizas999
Ese es el código, y creas una clase que implementa la interfaz Screen, en el constructor construyes tu etapa, y en el método de renderización, pones stage.draw (). Si no desea utilizar etapas, puede declarar una variable en la clase de tipo Implementada en pantalla Cámara, y hacer lo mismo que en Etapa, pero en el método de representación aplica una actualización a la cámara.
Rudy_TM
Esto en realidad funciona bastante bien.
you786
4

Creo que los "píxeles independientes del dispositivo" de Android son solo una medida para clasificar los dispositivos, y en realidad no están disponibles como píxeles renderizables. Para que no te pierdas ninguna infraestructura mágica de resolución de DPI. Hasta donde entiendo el estado del arte aquí, has descubierto todas las opciones. Hay dos enfoques básicos para tratar con diferentes dispositivos:

  1. Escale imágenes preexistentes para que coincidan con el DPI real del dispositivo.
  2. Elija entre una variedad de imágenes preescaladas en tiempo de ejecución basadas en el DPI.

Por supuesto, puede hacer una combinación de los dos (elegir una imagen más o menos precisa y luego escalarla), o usar diferentes enfoques para diferentes elementos de su interfaz de usuario (por ejemplo, imágenes preexistentes para fuentes / texto y escalado dinámico para el juego) sprites).

Lo que su juego específico está tratando de hacer realmente puede hacer una diferencia en qué enfoque tiene más sentido. Por ejemplo, si tiene un menú en pantalla, querrá asegurarse de que los botones sean un múltiplo razonable del tamaño de la punta de un dedo (por lo que el botón siempre es fácil de presionar, pero no es más grande de lo necesario en dispositivos grandes como tabletas). Alternativamente, si está tratando de construir un juego de rompecabezas en el que desea asegurarse de que todo el rompecabezas sea visible a la vez, deberá escalar los elementos para que quepan en la pantalla (por ejemplo, con un tic-tac-toe juego tal vez le gustaría que cada elemento use aproximadamente 1/3 de la pantalla).

Creo que para cosas como las fuentes que tienen muchos detalles finos, querrás tener una variedad de imágenes renderizadas previamente con texto, y luego elegir la mejor coincidencia. Por lo tanto, los botones pueden cambiar su forma / tamaño relativo de un dispositivo a otro, pero generalmente siempre se verán bien.

Echa un vistazo a los juegos para principiantes de Android de Mario Zerchner para una discusión de los problemas y algunas soluciones. Tenga en cuenta que Mario es el autor de libGDX, por lo que el enfoque del libro refleja el de libGDX (tenga en cuenta que no son uno a uno, el libro cubre la escritura de una biblioteca similar a libGDX, pero no libGDX en sí).

PT
fuente
Incluso si selecciono entre colecciones de imágenes prefabricadas basadas en DPI, no veo cómo puedo garantizar que "este sprite DEBE mostrarse como 64x64".
cenizas999
1
Estaba suponiendo que configura su cámara OpenGL para que coincida con la pantalla física, por lo que 1 mapas de píxeles OpenGL a 1 píxel de pantalla. En ese punto, una imagen de 64x64 aparecerá como 64x64 en la pantalla. Como señala Rudy_TM, puede meterse con el mapeo de la cámara para obtener una escala de pantalla completa.
PT
Bien, esto se parece a la "salsa secreta" que buscaba. Lo comprobaré y te lo haré saber, gracias.
cenizas999
0

Una forma de hacerlo es definir una relación de aspecto mínima y una relación de aspecto máxima para su juego. Estas serán las proporciones que desea apoyar. Luego debe usar una ventana gráfica que ahora se proporciona en libGdx. La ventana escalará su mundo según la configuración que proporcione.

Existen varios tipos de ventanas gráficas y debes seleccionar la que sea más adecuada para tu juego.

Puede usar ExtendViewport por ejemplo y fijar su altura o ancho y calcular el otro. Luego debe asegurarse de que todos los gráficos se puedan ver en su relación de aspecto mínima. La vista ampliada ampliará sus gráficos a la relación de aspecto correcta sin distorsionar los gráficos. Sin embargo, ExtendViewport funciona agregando espacio adicional a su mundo, por lo que también debe proporcionar gráficos para fondos, por ejemplo, que cubran toda su extensión de relaciones de aspecto cubiertas, cuando el mundo es más pequeño que su relación de aspecto máxima, la parte adicional de los gráficos no ser mostrado.

Dilom
fuente