Es ist ganz einfach: Schriftarten müssen nicht mit der Auflösung übereinstimmen, sondern mit der Pixeldichte .
Die Pixeldichte wird als Pixel pro Zoll ( PPI ) oder Pixel pro Zentimeter gemessen . Es gibt auch eine Maßeinheit, die als dichteunabhängige Pixel ( DP ) bezeichnet wird . Es ist definiert, dass dies 1dp
die Größe ist, die ein Pixel auf einem 160 PPI
Bildschirm hat.
Versuchen Sie nun, diesen Test erneut durchzuführen: Schalten Sie Ihren Laptop auf 720p. Sehen Sie sich die Schriftgröße an. Schließen Sie es jetzt an den 1080p 42 "-Monitor Ihres Desktops an. Wenn Ihr Monitor die richtigen Informationen über seine Größe ausgibt, sollte die Schrift genau die Größe haben, die sie auf dem 720p-Bildschirm hatte. Stellen Sie sich vor, wie seltsam es wäre, wenn Text in Ihrem Desktop wäre Der Laptop hatte eine andere Größe als der Text auf Ihrem Desktop-Monitor. Vor diesem Hintergrund sollten größere Auflösungen die Schriftart detaillierter und größere Bildschirme mehr Inhalte anzeigen.
Die gleiche Tatsache kann bei Texteditoren beobachtet werden. Eine 72pt
Schriftart sollte auf dem Bildschirm genauso aussehen wie auf Papier.
All dies bedeutet, dass Sie wahrscheinlich über alle Anzeigegrößen hinweg die gleiche Größe wünschen sollten (mit einigen Ausnahmen). Wenn Sie sich irgendwo niederlassen möchten, verwenden Websites normalerweise 12pt
Schriftarten, MS Windows 11pt
und 12pt
Schriftarten.
Dieses Diagramm (das auch am Ende der Antwort enthalten ist) sagt uns, dass 12pt
CSS ungefähr gleich ist wie 16px
CSS (als ob dies nicht verwirrend genug wäre, ist ein px in CSS überall mit dp identisch ), sagen wir also Ich mache deine Schriften 16dp
auf LibGDX.
Verwenden Sie in Ihrem Spiel die FreeTypeFontGenerator
Option, um Schriftarten dynamisch zu generieren. Auf diese Weise können Sie die Bildschirmdichte beim Erstellen berücksichtigen:
BitmapFont createFont(FreeTypeFontGenerator ftfg, float dp)
{
return ftfg.generateFont((int)(dp * Gdx.graphics.getDensity()));
}
//On Init
BitmapFont buttonFont = createFont(arial, 16); //16dp == 12pt
Dies funktioniert, weil Gdx.graphics.getDensity()
gleich YourScreenDensity/160
ein "Skalierungsfaktor" ist, um Dinge auf die Größe zu bringen, die sie auf einem 160ppi-Bildschirm haben würden.
Zu den Ausnahmen, die ich bereits erwähnt habe: Bei Logos, Promos usw. möchten Sie wahrscheinlich, dass die Schriftgröße entsprechend der Bildschirmgröße angepasst wird. Beachten Sie jedoch, dass Sie diese besser in einem Grafikeditor wie Photoshop oder Gimp erstellen sollten , wie auch immer.
Die andere Ausnahme ist Text auf winzigen Bildschirmen. 4,5 "oder kleinere Telefonbildschirme, Wearables. Normalerweise haben Sie keine Zeit, um Bildlaufinhalte zu erstellen, oder Sie können es sich einfach nicht leisten, so viel Inhalt auf diesen Bildschirm zu bringen. Sie können versuchen, die Schriftart zu 1dp
verkleinern, wie z Der Leser wird das Telefon wahrscheinlich sehr nahe am Gesicht haben, er wird wahrscheinlich kein Problem beim Lesen haben. Denken Sie daran, dass Sie den Spieler beim Lesen von unlesbarem kleinem Text möglicherweise ärgern.
TL; DR:
- Die physische Größe ändert sich ungefähr nicht direkt mit der Bildschirmgröße oder Auflösung, sondern mit einer Kombination aus beiden (
screenSize/resolution
dem berühmten PPI).
- Denken Sie an pt und dp . Vergessen Sie Bildschirmpixel, bis Sie das Endergebnis zeichnen müssen.
- Erstellen Sie Ihre Schrift zur Laufzeit mit einer angemessenen Größe.
- Konvertieren von dp in Bildschirmpixel:
pixels = dp * Gdx.graphics.getDensity();
- Wenn Sie eine Engine verwenden, die Ihnen keinen Konverter für dp wie LibGDX
Gdx.graphics.getDensity()
bietet, können Sie versuchen : densityFactor = Screen.getPixelsPerInch() / 160.0f
, dannpixels = dp * densityFactor
BEARBEITEN:
Am 25. Juni 2014 kündigte Matias auf Google IO eine neue Stilrichtlinie für Android an. Sie enthält eine neue Roboto-Richtlinien für Schriftarten und Typografie. Nehmen Sie diese Tabelle als Leitfaden:
EDIT2:
Enthaltene CSS-Schriftgrößentabelle für den Fall, dass der Link verrottet:
dp * Gdx.graphics.getDensity() * distanceFactor
. Sie können distanceFactor als Konstante festlegen2
und1
andernfalls beim Kompilieren für Konsole / TV definieren . Natürlich sollten Sie dafür bessere Werte finden.getDensity() == 0.6
, sind sie auf meinem Desktop nicht lesbar. Sie werden auf meinem Galaxy S8 klein, aber schön groß, wobei `getDensity () == 3 '. Ich habe die Dichte selbst berechnet und sie scheinen korrekt zu sein. Dann habe ich mein Telefon tatsächlich neben meine Desktop-Anwendung gehalten und sie sind tatsächlich gleich. Aber sollten sie nicht die Größe des tatsächlichen Bildes haben, das auf meinem Desktop angezeigt wird?dp * getDensity()
, sollten Sie wahrscheinlich tundp * getDensity() * scalingFactor
, wasscalingFactor
zum Zeitpunkt der Kompilierung entschieden werden sollte, und so etwas könnte funktionieren: Telefone:scalingFactor = 1
Computer:scalingFactor = 3
und TV :scalingFactor = 5
. Spiel mit diesen Zahlen!getPpiX() / 160)
, um ein besseres Ergebnis zu erzielen . AllerdingsgetDensity()
macht es in den meisten Fällen einen guten Job.