Problema para hacer coincidir el tamaño de fuente con la resolución de pantalla en libgdx

10

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)

Densidad de cálculo de Nexus 4

Y este es el resultado en mi MacBook: (480x800, densidad 0.6875)

ingrese la descripción de la imagen aquí

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.

ingrese la descripción de la imagen aquí

Iñaki Bedoya
fuente
¿Desea que el tamaño físico permanezca igual (texto de 2 cm en la computadora == 2 cm tekt en el móvil) o que el texto se ajuste a la pantalla?
Eejin
No estoy completamente seguro de lo que estás preguntando aquí. Esos enlaces que publicaste parecen responder a esta pregunta. Debe tener en cuenta el tamaño de la pantalla y el DPI. Por favor, elabore su pregunta para que pueda responderse correctamente.
Katu
Lo intentaré. Lo que quiero es mantener la misma proporción del texto entre diferentes tamaños de pantalla o resoluciones. Quiero decir, en una pantalla de cine obviamente tendrá un tamaño más grande en cm, pero en proporción tendrá los mismos márgenes. Entonces, no es exactamente lo que dijo @Eejin. Actualicé la publicación con una imagen que muestra lo que quiero decir.
Iñaki Bedoya

Respuestas:

15

Parece que desea mantener la misma relación de tamaño de texto / tamaño de pantalla. Básicamente, lo que haces es desarrollar en una resolución y dejar que sea escala 1.0. Luego divide el nuevo ancho de pantalla por el ancho anterior y ese es su factor de escala.

Por ejemplo. Desarrollado en 2560x1440 con tamaño de fuente 16 y ejecutándose en 1920x1080.

El tamaño de fuente será: 1920 * 16/2560 = 12

Hago lo mismo en mi biblioteca de interfaz y funciona perfectamente.

Eejin
fuente
Gracias @Eejin, es lo que necesitaba y funciona perfectamente. ¿Entonces las respuestas que vinculé son para mostrar el mismo tamaño real?
Iñaki Bedoya
También se trata de escalar con el dispositivo. Pero aquí la fuente se hace más grande para la resolución disponible y allí la fuente depende del dpi. Un monitor de 28 "2560x1440 tiene un dpi diferente que un teléfono de 5" 1920x1080. El método que desee siempre llenará una determinada parte y un método compatible con DPI cambiará el tamaño de fuente para que sean legibles y tenga en cuenta que puede haber más espacio de trabajo.
Eejin 01 de
¡Gracias! ¡¡funcionó!!
ParampalP
2
@kevinksmith Eso sería porque estás haciendo una división entera, no porque 'algunas versiones de Android' no estén haciendo el cálculo correctamente.
MichaelHouse
1
@ AshrafSayied-Ahmad El DPI no importa cuando necesita que el texto tenga un cierto porcentaje de píxeles de ancho de pantalla.
Eejin
2

No haga nada, solo configure la escala de la fuente y funcionará para todo tipo de dispositivo

 font.setScale( .9f,.9f);
Sudhir singh
fuente
Si agrega esto a su código en su respuesta para dar contexto a la mejor ubicación para poner esta solución, ayuda a los futuros usuarios a comprender su respuesta rápidamente.
Tom 'Blue' Piddock
Simplemente use esta línea donde crea su fuente de mapa de bits como en su código él creó su fuente de mapa de bits escribiendo font = createFont (generador, 64); Tan solo escriba la línea font.setScale (.9f, .9f); debajo de él
Sudhir singh