Problem z dopasowaniem rozmiaru czcionki do rozdzielczości ekranu w libgdx

10

Mam problemy z wyświetlaniem tekstu w mojej grze w tym samym rozmiarze na różnych ekranach i zrobiłem prosty test.

Ten test polega na pokazaniu dopasowania tekstu na ekranie. Chcę, aby tekst miał ten sam rozmiar niezależnie od ekranu i DPI.

Znalazłem i tę odpowiedź, która moim zdaniem powinna rozwiązać mój problem, ale nie. Na pulpicie rozmiar jest w porządku, ale w moim telefonie jest za duży.

To wynik mojego Nexusa 4: (768 x 1280, gęstość 2,0)

Nexus 4 oblicza gęstość

A to wynik na moim MacBooku: (480 x 800, gęstość 0,6875)

wprowadź opis zdjęcia tutaj

Używam Open Sans Condensed (link do czcionek Google)

Jak widać na pulpicie wygląda dobrze, ale na telefonie jest tak duży.

Oto kod mojego testu:

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();
    }
}

Próbuję znaleźć dobry sposób, aby to naprawić. Co robię źle? jest kamera? rzutnia?

AKTUALIZACJA:

Chcę zachować te same marginesy proporcjonalnie, niezależnie od wielkości ekranu i rozdzielczości. Ten obraz ilustruje, co mam na myśli.

wprowadź opis zdjęcia tutaj

Iñaki Bedoya
źródło
Czy chcesz, aby rozmiar fizyczny nie zmienił się (2 cm tekstu na komputerze == 2 cm tekt na telefonie komórkowym), czy też tekst powinien pasować do wyświetlacza?
Eejin
Nie jestem do końca pewien, o co tu pytasz. Te linki, które opublikowałeś, wydają się odpowiadać na to pytanie. Musisz być świadomy rozmiaru wyświetlacza i DPI. Proszę opracować swoje pytanie, aby można było na nie odpowiedzieć poprawnie.
Katu
Spróbuję tego. Chcę zachować tę samą proporcję tekstu między różnymi rozmiarami lub rozdzielczościami ekranu. Mam na myśli, że ekran kinowy będzie miał oczywiście większy rozmiar w cm, ale proporcjonalnie będzie miał te same marginesy. Więc nie jest dokładnie tym, co powiedział @Eejin. Zaktualizowałem post obrazem, który pokazuje, co mam na myśli.
Iñaki Bedoya

Odpowiedzi:

15

Wygląda na to, że chcesz zachować ten sam współczynnik wielkości tekstu / wielkości ekranu. Zasadniczo to, co robisz, rozwija się w jednej rozdzielczości i pozwala to być w skali 1.0. Następnie dzielisz nową szerokość ekranu przez starą szerokość i to jest twój współczynnik skali.

Na przykład. Opracowanie na 2560x1440 z czcionką o rozmiarze 16 i uruchomieniem na 1920x1080.

Rozmiar czcionki to: 1920 * 16/2560 = 12

Robię to samo w bibliotece interfejsów i działa idealnie.

Eejin
źródło
Dzięki @Eejin, jest to, czego potrzebowałem i działa idealnie. Więc odpowiedzi, które podłączyłem, pokazują ten sam rzeczywisty rozmiar?
Iñaki Bedoya
Chodzi również o skalowanie za pomocą urządzenia. Ale tutaj czcionka powiększa się dla dostępnej rozdzielczości i tam czcionka zależy od dpi. 28-calowy monitor 2560 x 1440 ma inną rozdzielczość niż 5-calowy telefon 1920 x 1080. Wybrana metoda zawsze wypełni określoną część, a metoda rozpoznająca DPI zmieni rozmiar czcionki, aby były czytelne i pamiętaj, że może być więcej miejsca do pracy.
Eejin
dzięki! zadziałało!!
ParampalP
2
@kevinksmith Wynika to z tego, że dokonujesz podziału liczb całkowitych, a nie dlatego, że „niektóre wersje Androida” nie wykonują poprawnie obliczeń.
MichaelHouse
1
@ AshrafSayied-Ahmad DPI nie ma znaczenia, kiedy tekst musi mieć określony procent pikseli szerokości ekranu.
Eejin
2

Nie rób nic, tylko ustaw skalę czcionki i będzie ona działać na wszystkich typach urządzeń

 font.setScale( .9f,.9f);
Sudhir singh
źródło
Czy możesz dodać to do jego kodu w swojej odpowiedzi, aby podać kontekst najlepszej lokalizacji do umieszczenia tego rozwiązania, pomoże to przyszłym użytkownikom szybko zrozumieć twoją odpowiedź.
Tom „Blue” Piddock
Wystarczy użyć tego wiersza, w którym tworzysz czcionkę bitmapową, tak jak w kodzie, który utworzył czcionkę bitmapową, pisząc font = createFont (generator, 64); Więc po prostu napisz wiersz font.setScale (.9f, .9f); poniżej
Sudhir singh