В дополнение к настройке исходного прямоугольника, вам необходимо установить целевые размеры для слоя изображения, иначе они будут такими же, как размер исходного изображения. Исходное изображение имеет размер 160x16, но вы хотите визуализировать один символ, поэтому у вас должно быть 16x16:
ImageLayer digit = graphics().createImageLayer(pointsFontImage);
digit.setSourceRect(((c - '0' + 9) % 10) * 16, 0, 16, 16);
digit.setWidth(16);
digit.setHeight(16);
pointsLayer.add(digit);
digit.setTranslation(x, 0f);
Я также не могу не отметить, что это чрезвычайно неэффективно во многих отношениях.
Метод update()
выполняется 60 раз в секунду (в идеальном мире). Вы без необходимости создаете и уничтожаете слои изображения в каждом кадре. Вы должны создать слой изображения один раз для каждой потенциальной цифры, а затем просто обновлять его исходный прямоугольник в каждом кадре. Вы также получаете цифры вашего points
значения очень дорогим способом.
Следующий код реже заставляет разработчика игр плакать по ночам:
int points = 50;
final float DIGIT_WIDTH = 16;
final float DIGIT_HEIGHT = 16;
final int MAX_DIGITS = 5;
@Override
public void update(float delta) {
initNails();
// peel off the right-most digit of points and update its layer;
// creating the layer on demand if we don't have one yet
int ll = 0;
for (int p = points; p > 0 || ll == 0; p /= 10, ll++) {
ImageLayer digit;
if (pointsLayer.size() <= ll) {
digit = graphics().createImageLayer(pointsFontImage);
digit.setWidth(DIGIT_WIDTH);
digit.setHeight(DIGIT_HEIGHT);
digit.setTranslation((MAX_DIGITS-ll-1) * DIGIT_WIDTH, 0);
pointsLayer.add(digit);
} else {
digit = (ImageLayer)pointsLayer.get(ll);
digit.setVisible(true);
}
int d = p%10, ix = ((d + 9) % 10);
digit.setSourceRect(ix * DIGIT_WIDTH, 0, DIGIT_WIDTH, DIGIT_HEIGHT);
}
// hide layers for leading zeros
while (ll < pointsLayer.size()) {
pointsLayer.get(ll++).setVisible(false);
}
}