Box2D - 如何防止在墙旁边连续跳跃

时间:2011-12-11 20:09:31

标签: java android game-physics libgdx

问候stackoverflow社区!

我正在开发一款使用Box2D进行碰撞检测和物理的Android游戏。现在,我正在实施一个基本的平台系统。跳跃到位,但它有一个小故障。以下功能用于确定玩家是否在地面上。简单吧?好吧,它运作正常,除非玩家就在墙旁边,在这种情况下它会让他不断跳起来,因为该功能仍然会返回true,即使墙不在玩家的正下方。 / p>

我尝试添加额外的X检查,以确保我与直接在我身下的东西发生碰撞,但无济于事。

private boolean isGrounded(float deltaTime) {               
    List<Contact> contactList = world.getContactList();

    for(int i = 0; i < contactList.size(); i++) {
        Contact contact = contactList.get(i);
        if(contact.isTouching() && (contact.getFixtureA() == sensorFixture ||
           contact.getFixtureB() == sensorFixture)) {               

            Vector2 pos = body.getPosition();
            WorldManifold manifold = contact.getWorldManifold();
            boolean below = true;
            Vector2 cpoint;
            for(int j = 0; j < manifold.getNumberOfContactPoints(); j++) {
                cpoint = manifold.getPoints()[j];
                below &= (
                            (cpoint.y < pos.y - 0.15f) 
                            && (cpoint.x > pos.x - w/2 + 3f)
                            && (cpoint.x < pos.x + w/2 - 3f)
                        );

                if(below) return true;
            }

            return false;
        }
    }
    return false;
}

那么,有没有人指出我能做些什么来使isGrounded检查更有效?

提前致谢! :)

1 个答案:

答案 0 :(得分:1)

我不熟悉Box2d,但我首先想到的是检查你所接触的物体的方向。快速检查文档将告诉您WorldManifold有一个getNormal,它提供从fixtureA到fixtureB的本地法线。从那里,您使用点积来比较X轴或Y轴的方向。然后你可以控制你想让玩家能够跳跃的表面有多陡峭。您可能需要将本地法线转换为世界空间。

来源:

  • Box2d Manual
  • LibGDX Docs