0

ゲームで使用しているスプライトには、複雑な形状とアニメーションがあります。また、スプライトの特定の部分に接触リスナーを設定することにのみ関心があります。関心のある特定の接触領域のフィクスチャを設定したいと思います。スプライト アニメーションをフレームごとに変更するときに、ボディ フィクスチャを適切な位置に移動し続けるにはどうすればよいですか?

4

3 に答える 3

1

これが正しいアプローチかどうかはわかりませんが、パフォーマンスに問題はないので、試してみてください。最初に、最後の位置を保存した後、ボディの現在のフィクスチャを破棄する必要があります。

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;
    }
于 2013-07-16T05:28:58.800 に答える
0

フィクスチャの位置を変更するには、それらを破壊し、必要な位置に新しいフィクスチャを作成します。しかし、ボディフィクスチャを変更するのは良い解決策ではないと思います。シミュレーションが壊れてパフォーマンスが低下する可能性があるからです。

于 2013-07-12T19:51:38.057 に答える