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 tę 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


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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.