Покадровое обновление позиции прибора box2d для анимации
Спрайты, которые я использую в своей игре, имеют сложные формы и анимацию. Также меня интересует только настройка контактных слушателей для определенных частей спрайта. Я хотел бы установить светильники для конкретных областей интересов. Как я могу держать движущиеся приспособления тела в правильных положениях, пока я меняю спрайтовые анимации кадр за кадром?
3 ответа
Невозможно изменить положение приборов. Только затем уничтожить и создать (но это снизит производительность).
Вместо этого вы можете создать 2 отдельных тела и соединить их, используя соединения. Это будет одинаковое поведение 2 приборов.
Я не знаю, является ли это правильным подходом или нет, но он не создает проблем с производительностью, поэтому вы можете попробовать его. Сначала вы должны уничтожить текущее крепление корпуса после сохранения его последней позиции.
float body_x=Body.getPosition().x;
float body_y=Body.getPosition().y;
Body.destroyFixture(Body.getFixtureList().get(0));
И тогда вы должны создать новый прибор для этого тела, как это
Body.createFixture(createFixturePart(
body_x,
body_y,
Width,
Height,
Angle, 1, 1, 0, -1));
Вот createFixturePart
это моя кастомизированная функция создавать крепеж тела. Вы можете иметь это при создании тела. А для нового прибора вы можете изменить Width
, height
а также Angle
приспособления согласно вашему требованию. Но не создавайте заново осветитель для каждого цикла рендеринга, вместо этого меняйте его только во время смены кадра в анимации или всей анимации.
createFixturePart Method
public FixtureDef createFixturePart(float x, float y, float width,
float height, float angle, int mass, int density, int type,
int groupIndex) {
PolygonShape shape = new PolygonShape();
shape.setAsBox(width, height);
shape.setAsBox(width / 2, height / 2, new Vector2(0, 0),
(float) Math.toRadians(angle));
MassData massData = new MassData();
massData.mass = mass;
bodyDef.position.y = y;
bodyDef.position.x = x;
Body body = worldbox.createBody(bodyDef);
body.setMassData(massData);
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
fixtureDef.density = density;
fixtureDef.filter.groupIndex = (short) groupIndex;
fixtureDef.restitution = 10;
return fixtureDef;
}
Чтобы изменить позиции приборов, уничтожьте их и создайте новые приборы в нужных местах. Но я думаю, что это не очень хорошее решение, чтобы изменить крепления тела, потому что это может испортить симуляцию и снизить производительность.