texture hiero font java libgdx lwjgl glyph

java - hiero - (Libgdx 1.6.1) Bloqueo de BitmapFontCache.draw debido a un índice fuera de límites



hiero libgdx (1)

Acabo de actualizar recientemente mi proyecto Libgdx de 1.4.x a 1.6.1. Utilizo BitmapFontCache para mi diálogo en mi juego, dibujando una cadena carácter por carácter usando BitmapFontCache.draw (inicio, fin). Esto funcionaba bien en 1.4.x, pero después de hacer los cambios necesarios para obtener 1.6.1 para compilar, parece causar un bloqueo cuando se habilita el ajuste después de que se muestra el último carácter. Extrañamente, esto no parece ser un problema con cadenas de una línea.

Así es como agrego mi texto:

fontCache.addText( message, fontPosX, fontPosY, fontWidth, Align.left, true);

Luego incremente el recuento de caracteres y dibuje. currentCharacter se detiene al llegar al final de la cadena en función de su longitud:

fontCache.draw( batch, 0, currentCharacter );

Esto funcionó bien en 1.4.x incluso con cadenas envueltas de múltiples líneas, pero parece causar una excepción fuera de límites si las líneas se ajustan a una segunda línea (se bloquea después de dibujar el último carácter). Aquí está la línea que causa el bloqueo en SpriteBatch.

System.arraycopy(spriteVertices, offset, vertices, idx, copyCount);

¿Hay alguna forma nueva de calcular el largo de la cuerda para dibujar? ¿Debo usar el return GlyphLayout de alguna manera? ¿O es esto quizás un error?


De acuerdo, sé dónde está el problema, y ​​estoy bastante seguro de que es un error en libgdx.

También tengo una solución alternativa, aunque es un poco hacky.

El problema Cuando GlyphLayout ajusta una línea en un carácter de espacio, optimiza el espacio de terminación. Entonces, con el espacio eliminado, la cantidad total de glifos en el diseño ahora es menor que la cantidad de caracteres en la cadena. Cuantas más líneas se envuelvan en un carácter de espacio, mayor será la discrepancia entre los dos.

La solución Para calcular qué longitud usar para representar el texto completo, necesitamos contar el número de glifos en el GlyphLayout en lugar del número de caracteres en el String. Aquí hay un código que hace eso ...

private int calcLength(GlyphLayout glyphLayout) { int length = 0; for(GlyphLayout.GlyphRun run : glyphLayout.runs) { length += run.glyphs.size; } return length; }

El GlyphLayout para pasar será el que fue devuelto por el método BitmapFontCache.addText() .