我刚刚将我的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);
我需要一种新的方法来计算绘图的字符串长度吗?我是否需要以某种方式使用返回GlyphLayout?或者这可能是一个错误?
答案 0 :(得分:2)
好的,我知道问题出在哪里,我很确定它是libgdx中的一个错误。
我也有一个解决方法,虽然它有点hacky。
问题
当GlyphLayout
在空格字符上包裹一行时,它会优化终止空间。因此,删除空格后,布局中的字形总数现在小于字符串中的字符数。包裹在空格字符上的线越多,两者之间的差异就越大。
解决方法 因此,为了计算出用于渲染全文的长度,我们需要计算GlyphLayout中的字形数而不是字符串中的字符数。这里有一些代码可以做到......
private int calcLength(GlyphLayout glyphLayout) {
int length = 0;
for(GlyphLayout.GlyphRun run : glyphLayout.runs) {
length += run.glyphs.size;
}
return length;
}
传入的GlyphLayout
将是BitmapFontCache.addText()
方法返回的 case R.id.delete_confirm:
Object tag = v.getTag();
。