Установить контакт включен в box2d andengine - PullRequest
0 голосов
/ 15 июля 2011

Как отключить контакт между двумя телами в box2d (Andengine).Я использовал contact.setEnabled(false), но у меня это не сработало.Я дал код ниже для справки.

    @Override
    public void beginContact(final Contact pContact) 
    {
        final Fixture fixtureA = pContact.getFixtureA();
        final Body bodyA = fixtureA.getBody();
        final Object userDataA = bodyA.getUserData();

        final Fixture fixtureB = pContact.getFixtureB();
        final Body bodyB = fixtureB.getBody();
        final Object userDataB = bodyB.getUserData();


        if(userDataA==null || userDataB==null)
            return;


        if(userDataA.equals(target) && userDataB.equals(ball)
        {   
              pContact.setEnabled(false);             

            }               
    }

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011
    @Override
    public void preSolve(Contact contact, Manifold oldManifold)
    {
        PhysicsConnectorManager mPC =     this.mPhysicsWorld.getPhysicsConnectorManager();
        Body targetBody = mPC.findBodyByShape(target);
        Body ballBody = mPC.findBodyByShape(ball);
        if (contact.getFixtureA().getBody() == targetBody && contact.getFixtureB().getBody() == ballBody)
        {
            contact.setEnabled(false);
        }
        else
        {
            contact.setEnabled(true);
        }
    }
1 голос
/ 15 июля 2011

Что касается Box2D, ваш код выглядит в основном правильно, кроме того, вам также необходимо проверить, нет ли мяча и цели напротив:

if( (userDataA.equals(target) && userDataB.equals(ball)) || 
    (userDataB.equals(target) && userDataA.equals(ball)) )

Но я думаю, что вашей главной проблемой может быть использование финала ... почему финал? Я не эксперт по Java, но это выглядит очень подозрительно, и быстрый взгляд на википедию говорит: «Конечную переменную можно инициализировать только один раз». Чтобы сохранить контакт отключенным, вам нужно делать SetEnabled (false) каждый кадр.

0 голосов
/ 31 августа 2013

У меня была такая же проблема, и благодаря @Rooban и его комментарию "fixture.isSensor = true;" Я решил это. Я работаю с box2dweb (порт JavaScript), и поскольку все API box2d похожи, это может помочь вам.

Допустим, у вас есть два объекта, СТЕНА и ИГРУШКА. ИГРУШКА проходит через стену.

    //WALL (toy detector)

    var toyDetectorFixDef = new box2d.b2FixtureDef();
    toyDetectorFixDef.density = 1;
    toyDetectorFixDef.friction = 0.5;
    toyDetectorFixDef.restitution = 0.5;
    toyDetectorFixDef.shape = new box2d.b2PolygonShape;
    toyDetectorFixDef.shape.SetAsBox(80 / SCALE, 5 / SCALE);//, new box2d.b2Vec2(bodyDef3.x, bodyDef3.y ), 4);

    //BE SURE YOU ADDED THIS LINE, SO THIS OBJECT IS ACTING AS A SENSOR
    toyDetectorFixDef.isSensor = true;

    var toyDetectorBodyDef = new box2d.b2BodyDef();
    toyDetectorBodyDef.type = box2d.b2Body.b2_staticBody;
    toyDetectorBodyDef.position.x = 100 / SCALE;
    toyDetectorBodyDef.position.y = 280 / SCALE;

    var rbDataToyDetector = new Object();
    rbDataToyDetector.bodyType = "toyDetector";
    toyDetectorBodyDef.userData = rbDataToyDetector;

    var toyDetectorBox = world.CreateBody(toyDetectorBodyDef);
    toyDetectorBox.CreateFixture(toyDetectorFixDef);

Затем вы должны добавить объект TOY.

    //TOY object

    var fixDef = new box2d.b2FixtureDef();
    fixDef.density = 1;
    fixDef.friction = 0.5;
    fixDef.restitution = 0.5;
    bodyDef = new box2d.b2BodyDef();
    bodyDef.type = box2d.b2Body.b2_dynamicBody;
    bodyDef.position.x = 200 / SCALE + Math.random() * 400 / SCALE;
    bodyDef.position.y = 0;
    var rbDataBall = new Object();
    rbDataBall.bodyType = "toy";
    bodyDef.userData = rbDataBall;
    fixDef.shape = new box2d.b2CircleShape(20 / SCALE);


    var toyBox = world.CreateBody(bodyDef);
    toyBox.CreateFixture(fixDef);

Теперь, когда у вас есть объекты, вы должны проверить их на столкновение.

        try {
        var listener = new Box2D.Dynamics.b2ContactListener;
        listener.BeginContact = function (contact) {

            if ((contact.GetFixtureA().GetBody().GetUserData().bodyType == "toyDetector" && contact.GetFixtureB().GetBody().GetUserData().bodyType == "toy") ||
                    (contact.GetFixtureA().GetBody().GetUserData().bodyType == "toy" && contact.GetFixtureB().GetBody().GetUserData().bodyType == "toyDetector")) {

                //YOUR CODE HERE
                console.log("Toy detected!");

            }

        }

        world.SetContactListener(listener);
    }
    catch (e) {
        console.log(e.toString());
    }

Надеюсь, это поможет вам.

...