Libgdx Box2d跳过

时间:2018-01-21 23:18:31

标签: libgdx box2d contact

我想在马里奥比赛中跳起来。当你在平台下跳跃时,你可以穿过对撞机。

当玩家的速度下降时,碰撞者应该醒来。我知道我应该使用ContactListener,但是当我使用contact.setEnable(false)方法时,没有任何反应。

我的联系人听众(地面检查员工作正常)

world.setContactListener(new ContactListener() {
        @Override
        public void beginContact(Contact contact) {
            if(contact.getFixtureA().getBody().getUserData() == "ground" && contact.getFixtureB().getUserData() == "groundChecker"){
                character.isGrounded = true;
                System.out.println(" Colliding");
            }
        }

        @Override
        public void endContact(Contact contact) {

        }

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

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

        }
    });

我应该用什么以及在哪里实现这样的效果。

enter image description here

enter image description here

Collider应该只有一方,有人处理它吗?

1 个答案:

答案 0 :(得分:2)

找到一个解决方案,我希望它会有所帮助。

world.setContactListener(new ContactListener() {
        @Override
        public void beginContact(Contact contact) {
            //setting isGrounded boolean variable in our character class, but we need to check "player" velocity, because we don't want to enable jumping when only ground will passed througt
            if(contact.getFixtureA().getBody().getUserData() == "ground" && contact.getFixtureB().getUserData() == "groundChecker" && (contact.getFixtureB().getBody().getLinearVelocity().y < 0 || contact.getFixtureB().getBody().getLinearVelocity().y == 0)){
                character.isGrounded = true;
            }
        }

        @Override
        public void endContact(Contact contact) {

        }

        @Override
        public void preSolve(Contact contact, Manifold oldManifold) {
            //we have to disable contact when our "player" fixture collide with "ground" fixture
            if(contact.getFixtureA().getBody().getUserData() == "ground" && contact.getFixtureB().getUserData() == "player"){
                contact.setEnabled(false);
            }
            //and we need to disable contact when our "groundChecker" will collide with "ground" and we need to check what velocity.y of player body is, when it is bigger than 0 contact should be falsed
            if(contact.getFixtureA().getBody().getUserData() == "ground"  && contact.getFixtureB().getUserData() == "groundChecker" && contact.getFixtureB().getBody().getLinearVelocity().y > 0){
                contact.setEnabled(false);
            }
        }

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

        }
    });

当我们的“玩家”夹具与“地面”夹具碰撞时,我们必须禁用接触。 像这样。

if(contact.getFixtureA().getBody().getUserData() == "ground" && contact.getFixtureB().getUserData() == "player"){
                contact.setEnabled(false);
}

当我们的“groundChecker”与“地面”发生碰撞时我们需要禁用接触,我们需要检查玩家身体的速度是什么,当它大于0时,接触应该被愚弄。

if(contact.getFixtureA().getBody().getUserData() == "ground"  && contact.getFixtureB().getUserData() == "groundChecker" && contact.getFixtureB().getBody().getLinearVelocity().y > 0){
                contact.setEnabled(false);
}

以下是上述解决方案的演示:

enter image description here