Покадровое обновление позиции прибора 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;
    }

Чтобы изменить позиции приборов, уничтожьте их и создайте новые приборы в нужных местах. Но я думаю, что это не очень хорошее решение, чтобы изменить крепления тела, потому что это может испортить симуляцию и снизить производительность.

Другие вопросы по тегам