Мне нужно правильно нарисовать повернутые девять патчей в зависимости от их положения в мире Box2d.
Метод Spritebatch.draw не обрабатывает девять патчей, поэтому мне приходится использовать метод NinePatch.draw.
Box2d использует центр в качестве начала координат применить вращение тела.
Проблема в том, что
Код: Выделить всё
NinePatch.draw
Обратите внимание, что я размещаю кирпичи в мире, рассматривая их центр как начало координат, поэтому в Метод draw я сделаю body.getPosition().x - widthInWorld / 2.
Код: Выделить всё
game.getBatch()
Кирпич имеет PNG-изображение с девятью патчами размером 130 x 34 пикселя (то есть 128 x 32 без границ патча) и его размер в мире. составляет 4 x 1 (как вы можете видеть на скриншотах).
Это углы поворота кирпичей:

Фактическое рабочее решение
Я нашел это рабочее решение, но оно вызывает Android Студия, чтобы предупредить «Возможная очистка внутри цикла» (хорошо сказано, потому что пакетная установка.setTransformMatrix выполняет внутреннюю очистку. Дополнительная информация в этом вопросе SO).
Код: Выделить всё
Matrix4 tempMatrix = new Matrix4();
Matrix4 originalMatrix = new Matrix4();
DelayedRemovalArray
bricks = ...;
bricks.begin();
for(Brick brick : bricks) {
brick.draw(game.getBatch());
}
bricks.end();
Код: Выделить всё
Brick.draw
Код: Выделить всё
NinePatchDrawable ninePatchDrawable = ...;
public void draw(SpriteBatch batch) {
originalMatrix.set(batch.getTransformMatrix());
tempMatrix.set(originalMatrix);
tempMatrix
.translate(widthInWorld/2, heightInWorld/2, 0)
.rotate(0, 0, angle, 10)
.translate(-widthInWorld/2, -heightInWorld/2, 0);
batch.setTransformMatrix(tempMatrix);
ninePatchDrawable.draw(
batch,
0,
0,
0,
0,
widthInWorld,
heightInWorld,
1f,
1f,
0
);
batch.setTransformMatrix(originalMatrix);
}

Без Matrix4
Код: Выделить всё
public void draw(SpriteBatch batch) {
ninePatchDrawable.draw(
batch,
body.getPosition().x - widthInWorld / 2,
body.getPosition().y - heightInWorld / 2,
0,
0,
widthInWorld,
heightInWorld,
1,
1,
body.getAngle() * MathUtils.radiansToDegrees
);
}

Поскольку пакетная очистка влияет на производительность, есть ли лучший способ добиться этого?
Ps. Я уже искал и читал ответы других SO и в Интернете по поводу подобных проблем, но не нашел лучшего решения.
Большое спасибо
Подробнее здесь: https://stackoverflow.com/questions/791 ... -and-box2d