4

私はこれに本当にこだわっています。衝突を正常に検出できますが、衝突に関与する2つのボディをくっつけることができません。

ここに私のContactListenerがあります

world.setContactListener(listener);

    listener = new ContactListener() {

        @Override
        public void preSolve(Contact contact, Manifold oldManifold) {

        }


        @Override
        public void postSolve(Contact contact, ContactImpulse impulse) {

        }

        //called when two fixtures cease to touch
        @Override
        public void endContact(Contact contact) {
            Fixture fixtureA = contact.getFixtureA();
            Fixture fixtureB = contact.getFixtureB();
            Gdx.app.log("beginContact", "between" + fixtureA.toString() + "and" + fixtureB.toString());
        }

        //called when two fixtures begin to touch
        @Override
        public void beginContact(Contact contact) {
            Fixture fixtureA = contact.getFixtureA();
            Fixture fixtureB = contact.getFixtureB();
            Gdx.app.log("beginContact", "between" + fixtureA.toString() + "and" + fixtureB.toString());
        }
    };

また、これは world.step() 行の直後に render() に入れたものです

int numContacts = world.getContactCount();

    if(numContacts > 0)
    {
        Gdx.app.log("contact", "start of contact list");
        for(Contact contact: world.getContactList())
        {
            Fixture fixtureA = contact.getFixtureA();
            Fixture fixtureB = contact.getFixtureB();
            Gdx.app.log("contact", "between" + fixtureA.toString() + "and" + fixtureB.toString());
        }
        Gdx.app.log("contact", "end of contact list");
    }

私はポストソルブまたはプレソルブに何を置くべきかについて非常に悩んでいます。iforce2d スティッキー プロジェクタイルhttp://www.iforce2d.net/b2dtut/sticky-projectilesに従いましたが、 C++ を理解できず、Eclipse で作業すると多くの構文エラーが発生します。Javaで衝突した後に体がくっつく作業中の衝突のサンプルコードを誰かに見せてください。

4

1 に答える 1

5

これは、libgdx ラッパーを使用してWeldJointを作成する方法です。

WeldJointDef wd = new WeldJointDef();
wd.bodyA = body1;
wd.bodyB = body2;
wd.referenceAngle = wd.bodyB.getAngle() - wd.bodyA.getAngle();
world.createJoint( wd );

ContactListener 内でジョイントを作成しようとしないでください。接着するボディをリストに追加し、 world.stepの直後にチェックします。

編集:

OK、iforce2d チュートリアルのように、 2 つのボディを含むオブジェクトを作成します。

public class StickyInfo{
    Body bodyA;
    Body bodyB;
    public StickyInfo(Body bodyA, Body bodyB){
        this.bodyA = bodyA;
        this.bodyB = bodyB;
    }
};

次に、 StickyInfo のlibgdx 配列を作成します。

Array<StickyInfo> collisionsToMakeSticky = new Array<StickyInfo>();

ボディが衝突するとき (技術的にはフィクスチャ)、次のリストに追加します。

collisionsToMakeSticky.add(new StickyInfo(body1, body2))

そして、配列が空でない場合は、world.stepの直後。WeldJoint を作成します。

while(collisionsToMakeSticky.size>0){
    StickyInfo si = collisionsToMakeSticky.removeIndex(0);
    //Make the WeldJoint with the bodies si.bodyA and si.bodyB
}
于 2014-01-22T21:39:26.067 に答える