Libgdx Box2d 跳转

Libgdx Box2d Jumping through

我想像马里奥游戏一样跳跃。当你在平台下跳跃时,你可以通过对撞机。

当玩家的速度下降时,碰撞器应该唤醒。我知道我应该使用 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

对撞机应该只有一侧,有人处理过吗?

已找到解决方案,希望对您有所帮助。

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) {

        }
    });

当我们的 "player" 夹具与 "ground" 夹具碰撞时,我们必须禁用接触。 像这样。

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

当我们的 "groundChecker" 与 "ground" 发生碰撞时,我们需要禁用接触,我们需要检查玩家 body 的 velocity.y 是什么,当它更大时大于 0,联系应该是假的。

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

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