【问题标题】:How to make two bodies stick after a collision?碰撞后如何使两个物体粘在一起?
【发布时间】:2014-01-22 21:02:11
【问题描述】:

我真的被困在了这个我可以成功检测到碰撞但我不能让参与碰撞的两个物体粘在一起。

这是我的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中碰撞后身体粘在一起。

【问题讨论】:

    标签: java libgdx box2d jbox2d


    【解决方案1】:

    这是您使用 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 之后检查它们。

    编辑:

    好的,就像在iforce2d tutorial 中一样,创建一个包含2 个主体的对象:

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

    然后创建一个 libgdx Array 的 StickyInfo 的

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

    当物体发生碰撞时(嗯,从技术上讲,它们的固定装置),将它们添加到此列表中:

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

    然后在 world.step 之后,如果 Array 不为空。创建焊接接头:

    while(collisionsToMakeSticky.size>0){
        StickyInfo si = collisionsToMakeSticky.removeIndex(0);
        //Make the WeldJoint with the bodies si.bodyA and si.bodyB
    }
    

    【讨论】:

    • 你能帮我解决这个问题吗?我已经尝试了一个多星期,但我仍然离它还很远,我知道如何做焊接接头,但我不知道你的意思是添加要粘在列表上的身体并检查它们。
    • 编辑了我的答案@user3197976
    • 非常感谢,这更有意义,现在我试试这个,如果我遇到问题,请告诉你,但非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多