问候stackoverflow社区!

我正在开发一款使用Box2D进行碰撞检测和物理处理的Android游戏。 现在,我正在实现一个基本的Platformer系统。 跳到位,但故障很小。 以下功能旨在确定玩家是否在地面上。 简单吧? 好吧,它工作正常,除非玩家紧挨着墙,在这种情况下,它只会让他不断跳起来,因为即使墙不在玩家正下方,该功能仍会返回true。

我尝试添加其他x-check,以确保我与自己正下方的东西发生碰撞,但无济于事。

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 票数:1 已采纳

我对Box2d不熟悉,但是我的第一个想法是检查与您接触的对象的方向。 快速查看文档会发现WorldManifold具有getNormal,该getNormal提供了从夹具A指向夹具B的局部法线。 在此处,您可以使用点积将方向与X轴或Y轴进行比较。 然后,您可以确定要让玩家能够跳跃的表面有多陡峭。 您可能需要将局部法线转换为世界空间。

资料来源:

  • Box2d手册
  • LibGDX文件
  •   ask by Andrei Bârsan translate from so

    未解决问题?本站智能推荐:

    1回复

    如何在libGDX的Box2D ContactListener中处理Null指针异常?

    大家好吗, 我试图通过libGDX在Box2D中产生一个Pong克隆。 Null指针异常起源于ContactListener的beginContact()方法,在此方法中我试图实现评分逻辑。 Box2D世界使用两个单独的EdgeShapes作为传感器,以在与Ball碰撞时增加得分变
    1回复

    Libgdx-Box2D:将Physics Body Editor加载器蒙版附加到动态纹理

    我有一个圆形的纹理,当发生触摸拖动时,该纹理将被绘制到新的位置。 它没有设置为主体。 我已经使用Aurelien Ribon的“ Physics Body Editor”加载程序GUI绘制了一个物理图,并将其绘制到圆的上部和下部,我想在纹理的位置上绘制该蒙版,并在发生拖动时绘制到其新位置
    2回复

    2D游戏物理:击中平台演员不会停止

    如果在游戏中,演员要跳上平台就跳了起来。 为了使他停在平台上,我需要设置什么速度/位置/重力? 关于游戏物理学的任何指示都很好。 我觉得是这样吗? 这就是我尝试使用velocity.y = 0; 在hitPlatform() ,速度会在更新方法中增加重力,而位置会在更新方法中增加
    2回复

    你能将Spriter Pro 2d装配的精灵导入LibGDX吗?

    正如它所说,我已经在线阅读有关Spine被导入LibGDX的信息。 我正在使用Android Studio开发游戏并使用LibGDX框架。 但是我的游戏需要2D装配动画而不是预渲染模型,所以我使用的是Spriter Pro。 但我想知道如何将我从Spriter Pro制作的内容导入到Lib
    1回复

    LibGDX-Box2D:使用2个手指的MouseJoint

    我想用两根手指控制盒子,如下所示: 我有基本的MouseJoint implementation : 如何使用两根手指修改此类?
    3回复

    Android,libgdx和box2d基础知识[关闭]

    自从我开始学习android之后,我写了几个简单的棋盘游戏,请让我知道是否有任何教程或链接,我可以从libgdx的物理库开始,用libgdx寻找物理基础知识
    1回复

    LibGDX Box2D RayCast致命错误

    我正在进行raycast,但是有一个大问题。 这是错误消息。 您可以在这里查看日志文件http://paste.ubuntu.com/11287130/这是我的回调和splitObj。 我想切片一个对象(ChainShape),并且有一个可以在该链形内移动的球。我监听to
    1回复

    libGDX Box2D:碰撞后如何破坏尸体?

    谢谢你的时间。 我正在通过libGDX使用Box2D创建Pong克隆。 当由于球体与两个目标传感器体之一接触而删除球体时(下图),我遇到了一个粘滞点,导致空指针异常。 我想将联系Ball主体添加到列表中,以便以后可以在列表中进行迭代以删除Ball主体(以及将来的多个Ball主体)。
    1回复

    为什么Box2d中的车轮运动不会导致汽车运动?

    我正在为我的Android游戏(Java + LibGDX)开发基于Box 2d物理原理的移动车辆。 当我以为自己一切都准备就绪并开始运转时,我的两个车轮汽车停在地上,但是当我旋转车轮时,汽车不动。 那是我的游戏课: 和英雄类(实际上应该称为汽车)
    1回复

    如何使用libgdx在Box2D中的碰撞事件中设置false / NoCollision?

    我正在使用Box2D作为物理引擎开发适用于Android的2D水下动作RPG,主要用于碰撞检测,碰撞响应以及在由墙壁,岩石和其他生物组成的环境中游戏角色的移动。 我正在尝试实现角色动画(按照Box2D中做角色动画的最佳方法 )。 问题是我想在发生碰撞时抑制碰撞响应。 有人告诉我应该