Java (Libgdx 1.6.1)由于索引超出范围而导致BitmapFontCache.draw崩溃

Java (Libgdx 1.6.1)由于索引超出范围而导致BitmapFontCache.draw崩溃,java,libgdx,lwjgl,glyph,Java,Libgdx,Lwjgl,Glyph,我最近刚刚将我的Libgdx项目从1.4.x更新到1.6.1。我在游戏中使用BitmapFontCache进行对话,使用BitmapFontCache.draw(开始、结束)逐个字符绘制字符串。这在1.4.x中运行良好,但在进行必要的更改以生成1.6.1之后,在显示最后一个字符后启用换行时,似乎会导致崩溃。奇怪的是,这似乎不是单行字符串的问题 以下是我添加文本的方式: fontCache.addText( message, fontPosX, fontPosY, fontWidth, Align

我最近刚刚将我的Libgdx项目从1.4.x更新到1.6.1。我在游戏中使用BitmapFontCache进行对话,使用BitmapFontCache.draw(开始、结束)逐个字符绘制字符串。这在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);

有没有一种新的方法,我需要计算的长度字符串的绘图?我是否需要以某种方式使用返回字形布局?或者这可能是一个bug?

好的,我知道问题所在,我很确定这是libgdx中的bug

我也有一个变通办法,虽然有点不太妥当

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

解决方法 因此,为了计算呈现全文所使用的长度,我们需要计算GlyphLayout中的glyph数,而不是字符串中的字符数。这里有一些代码可以做到这一点

private int calcLength(GlyphLayout glyphLayout) {

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

要传入的
GlyphLayout
将是由
BitmapFontCache.addText()方法返回的文件。

您能提供完整的堆栈跟踪吗?当然,我到家后会发布它。这非常有效!感谢您提供了非常清晰的解决方案。这个错误已经报告了吗?看来这会影响很多比赛。太棒了!很高兴它对你有用。我不知道是否有报告,但如果我能找到去哪里,我会的。我看了这里,但还没有看到报告,除非它在夜间更新中得到修复。这在1.7.0中得到修复吗?我在使用FreeTypeFontGenerator的TextFields时得到了类似的结果。你能给我一些线索吗?我的帖子: