我最近才将Libgdx项目从1.4.x更新到1.6.1。我在游戏中使用BitmapFontCache进行对话,使用BitmapFontCache.draw(start,end)逐个字符绘制一个字符串。在1.4.x中,这可以正常工作,但是在进行了必要的更改以构建1.6.1之后,在显示最后一个字符后启用换行时,似乎导致崩溃。奇怪的是,这似乎不是一个行字符串的问题。

这是我添加文字的方式:

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

然后我增加字符数并绘制。当根据字符串的长度到达字符串末尾时,currentCharacter停止:
fontCache.draw( batch, 0, currentCharacter );

即使在多行换行的字符串中,这在1.4.x中也能正常工作,但如果将行换行到第二行(绘制最后一个字符后崩溃),似乎会导致超出范围的异常。这是导致SpriteBatch崩溃的行。
System.arraycopy(spriteVertices, offset, vertices, idx, copyCount);

我需要一种新的方式来计算绘图用字符串的长度吗?我需要以某种方式使用return GlyphLayout吗?还是这可能是一个错误?

最佳答案

好的,我知道问题出在哪里,而且我可以肯定这是libgdx中的错误。

我也有一个解决方法,尽管它有点小巧。

问题
GlyphLayout在空格字符上换行时,它将优化终止空间。因此,删除空格后,布局中字形的总数现在少于字符串中的字符数。用空格字符换行的行越多,两者之间的差异就越大。

解决方法
为了计算出呈现全文所用的长度,我们需要计算GlyphLayout中字形的数量而不是String中的字符数。这是执行此操作的一些代码...

private int calcLength(GlyphLayout glyphLayout) {

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

传递的GlyphLayout将是BitmapFontCache.addText()方法返回的那个。

07-28 00:00