Ich drucke einen Schiebetext, indem ich jeden Buchstaben nach kurzer Zeit hinzufüge. Mein Problem ist, dass wenn der Text mehrzeilig ist, das letzte Wort einer Zeile in der aktuellen Zeile beginnt und zum nächsten springt, wenn es zu groß wird, um zu passen, was zu einem hässlichen Effekt führt.
Ich muss also das Wort bestimmen, bei dem die Linie brechen würde, und das vorherige Leerzeichen durch Zeilenumbruch ersetzen, um den Bruch zu erzwingen, bevor das Wort den Rand erreicht. Ich verstehe nicht, wie das geht. Außerdem, wenn es eine Möglichkeit gibt, die libgdx BitmapFont
berechnen zu lassen, würde ich gerne lernen.
BitmapFont
s haben einegetBounds
Methode: ( libgdx.l33tlabs.org/docs/api/com/badlogic/gdx/graphics/g2d/… Sie können damit überprüfen, wann eine Linie die Umbruchbreite überschreitet .Antworten:
Grundsätzlich lautet der Algorithmus wie folgt:
maxBreak
Wickellänge einstellen.nextBreak
aufmaxBreak
undnewString
auf""
undlastBreak
auf0
nextBreak
ein Unterbrechungszeichen ist (Leerzeichen, neue Zeile usw.).nextBreak
und wiederholen Sie Schritt 4nextBreak
Länge wickelnlastBreak
->nextBreak
und ein neues Zeilenzeichen hinzunewString
lastBreak
=nextBreak
und füge Wrap-Länge hinzunextBreak
nextBreak
die ursprüngliche Zeichenfolgenlänge größer ist.In weniger Worten. Sie möchten mit der maximalen Wickellänge beginnen und rückwärts arbeiten, bis Sie einen Haltepunkt finden. Wenn Sie es finden, fügen Sie ein Zeilenumbruchzeichen ein. Wiederholen Sie dies, bis Sie das Ende Ihrer ursprünglichen Zeichenfolge erreicht haben.
Nun im Code:
Wo
string
ist die Zeichenfolge, die Sie brechen möchten undcharWrap
ist die maximale Anzahl von Zeichen pro Zeile zulässig?Um herauszufinden, was
charWrap
sein sollte, möchten Sie wahrscheinlich die durchschnittliche Breite Ihrer Zeichen in Pixel ermitteln und dann sehen, wie viele Sie in den verfügbaren Platz passen können.quelle
charWrap
durch Aufrufenfont.computeVisibleGlyphs(text, 0, text.length(), WIDTH)
, woWIDTH
die verfügbare Bildschirmgröße ist (Änderungen mit Größenänderung), sodass ich die Anzahl der Zeichen nicht erraten muss, zumindest für die erste Zeile, die noch daran arbeitet =). Ihr Code hat so wie er ist perfekt funktioniert und war eine nette Extrameile, nachdem Sie den Algorithmus gezeigt haben. Vielen Dank.