Tengo problemas para mostrar el texto en mi juego al mismo tamaño en diferentes pantallas, e hice una prueba simple.
Esta prueba consiste en mostrar un ajuste de texto en la pantalla, quiero que el texto tenga el mismo tamaño independientemente de la pantalla y del DPI.
He encontrado esto y esta respuesta que creo que debería resolver mi problema, pero no lo hago. En el escritorio, el tamaño está bien, pero en mi teléfono es demasiado grande.
Este es el resultado en mi Nexus 4: (768x1280, densidad 2.0)
Y este es el resultado en mi MacBook: (480x800, densidad 0.6875)
Estoy usando Open Sans Condensed (enlace a fuentes de google)
Como puede ver en el escritorio se ve bien, pero en el teléfono es muy grande.
Aquí el código de mi prueba:
public class TextTest extends ApplicationAdapter
{
private static final String TAG = TextTest.class.getName();
private static final String TEXT = "Tap the screen to start";
private OrthographicCamera camera;
private Viewport viewport;
private SpriteBatch batch;
private BitmapFont font;
@Override
public void create ()
{
Gdx.app.log(TAG, "Screen size: "+Gdx.graphics.getWidth()+"x"+Gdx.graphics.getHeight());
Gdx.app.log(TAG, "Density: "+Gdx.graphics.getDensity());
camera = new OrthographicCamera();
viewport = new ExtendViewport(Gdx.graphics.getWidth(), Gdx.graphics.getWidth(), camera);
batch = new SpriteBatch();
FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/OpenSans-CondLight.ttf"));
font = createFont(generator, 64);
generator.dispose();
}
private BitmapFont createFont(FreeTypeFontGenerator generator, float dp)
{
FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter();
int fontSize = (int)(dp * Gdx.graphics.getDensity());
parameter.size = fontSize;
Gdx.app.log(TAG, "Font size: "+fontSize+"px");
return generator.generateFont(parameter);
}
@Override
public void render ()
{
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
int w = -(int)(font.getBounds(TEXT).width / 2);
batch.setProjectionMatrix(camera.combined);
batch.begin();
font.setColor(Color.BLACK);
font.draw(batch, TEXT, w, 0);
batch.end();
}
@Override
public void resize(int width, int height)
{
viewport.update(width, height);
}
@Override
public void dispose()
{
font.dispose();
batch.dispose();
}
}
Estoy tratando de encontrar una forma ordenada de arreglar esto. ¿Qué estoy haciendo mal? es la camara la ventana gráfica?
ACTUALIZAR:
Lo que quiero es mantener los mismos márgenes en proporción, independientemente del tamaño o la resolución de la pantalla. Esta imagen ilustra lo que quiero decir.