(Libgdx 1.6.1) BitmapFontCache.draw аварийно завершает работу из-за выхода индекса за границы

Недавно я обновил свой проект 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);

Есть ли новый способ расчета длины строки для рисования? Нужно ли каким-то образом использовать возвращаемый GlyphLayout? Или это возможно баг?


person Arbel    schedule 03.06.2015    source источник
comment
Не могли бы вы предоставить полную трассировку стека, пожалуйста?   -  person Phil Anderson    schedule 08.06.2015
comment
Конечно, выложу, когда вернусь домой.   -  person Arbel    schedule 09.06.2015


Ответы (1)


Хорошо, я знаю, в чем проблема, и я почти уверен, что это ошибка в 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().

person Phil Anderson    schedule 09.06.2015
comment
Это прекрасно работает! Спасибо за очень понятное решение. Об этой ошибке уже сообщалось? Кажется, это затронет довольно много игр. - person Arbel; 09.06.2015
comment
Превосходно! Рад, что это сработало для вас. Я не знаю, сообщалось ли об этом, но если я смогу узнать, куда это можно сделать, я это сделаю. - person Phil Anderson; 09.06.2015
comment
Я посмотрел здесь, но пока не вижу сообщений об этом github.com/libgdx/libgdx/issues Если только это исправлено в ночном обновлении. - person Arbel; 10.06.2015
comment
Это исправлено в 1.7.0? - person JohnyTex; 25.09.2015
comment
Я получаю нечто подобное при использовании TextFields с FreeTypeFontGenerator. Не могли бы вы дать мне некоторые подсказки? Моя тема: stackoverflow.com/questions/32786208/ - person JohnyTex; 26.09.2015