Нарисуйте повернутые девять патчей с помощью LibGDX и Box2d.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Нарисуйте повернутые девять патчей с помощью LibGDX и Box2d.

Сообщение Anonymous »

Я использую Android Studio с Java и LibGDX.
Мне нужно правильно нарисовать повернутые девять патчей в зависимости от их положения в мире Box2d.
Метод Spritebatch.draw не обрабатывает девять патчей, поэтому мне приходится использовать метод NinePatch.draw.
Box2d использует центр в качестве начала координат применить вращение тела.
Проблема в том, что

Код: Выделить всё

NinePatch.draw
вращает объект вокруг нижнего левого угла тела[/b], а не вокруг центра (как это делает SpriteBatch.draw), что приводит к неправильному положению рисования. Эта разница также приводит к неправильному вращению тел с RevoluteJoint и двигателем.
Обратите внимание, что я размещаю кирпичи в мире, рассматривая их центр как начало координат, поэтому в Метод draw я сделаю body.getPosition().x - widthInWorld / 2.

Код: Выделить всё

game.getBatch()
возвращает набор SpriteBatch с помощью setProjectionMatrix(viewport.getCamera().combined); и область просмотра устанавливается как новый FitViewport(WORLD_WIDTH, WORLD_HEIGHT);
Кирпич имеет 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Нарисуйте повернутые девять патчей с помощью LibGDX и Box2d.
    Anonymous » » в форуме JAVA
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как выполнить удаление объекта при контакте Box2D LibGDX
    Гость » » в форуме JAVA
    0 Ответы
    33 Просмотры
    Последнее сообщение Гость
  • Libgdx Box2D управляет реакцией на столкновение только для нескольких конкретных объектов.
    Anonymous » » в форуме JAVA
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • (Java LibGDX) Как изменить размер текстур в LibGDX?
    Anonymous » » в форуме JAVA
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • (Java LibGDX) Как изменить размер текстур в LibGDX?
    Anonymous » » в форуме Android
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»