Java Box2D-如何防止在靠近墙壁时连续跳跃

Java Box2D-如何防止在靠近墙壁时连续跳跃,java,android,game-physics,libgdx,Java,Android,Game Physics,Libgdx,欢迎来到我们的社区 我正在开发一款Android游戏,它使用Box2D进行碰撞检测和物理处理。现在,我正在实现一个基本的平台系统。跳跃已经就位,但有一个小故障。以下功能用于确定球员是否在地面上。很简单,对吧?好吧,它可以正常工作,除非玩家就在墙的旁边,在这种情况下,它会让他不断地跳起来,因为函数仍然会返回真值,即使墙不是在玩家的正下方 我已经尝试添加额外的x光检查,以确保我与我正下方的物体碰撞,但没有效果 private boolean isGrounded(float deltaTime) {

欢迎来到我们的社区

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

我已经尝试添加额外的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;
}
private boolean是固定的(float deltaTime){
List contactList=world.getContactList();
对于(int i=0;i位置x-带2+3层)
&&(C点x<位置x+w/2-3f)
);
如果(下面)返回true;
}
返回false;
}
}
返回false;
}
那么,有没有人对我能做些什么来提高isGrounded检查的效率有什么建议


提前感谢!:)

我不熟悉Box2d,但我的第一个想法是检查您所接触的对象的方向。快速查看文档将告诉您WorldManifold有一个getNormal,它提供一个从fixtureA指向fixtureB的本地法线。然后,使用点积将方向与X轴或Y轴进行比较。然后你可以设定一个门槛,让玩家可以跳到多陡的表面上。可能需要将局部法线转换为世界空间

资料来源:

  • 谢谢!:D这段简单的代码似乎起到了作用:
    if(c.getWorldManifold().getNormal().y>0)返回true啊,基于脚部传感器的方法是我以前使用过的方法(因为这个方法不起作用,所以是另一种实现),功能也很好!我将测试这两个系统,如果它们之间有任何显著差异,我将在这里发布。再次感谢!