Java LIBGDX-碰撞问题和滑动效果问题

Java LIBGDX-碰撞问题和滑动效果问题,java,android,libgdx,box2d,runner,Java,Android,Libgdx,Box2d,Runner,我正在创建一个跑步者游戏,下面是一个屏幕截图: 我把我的世界分成了几块,我遇到了碰撞问题。正如你在左下角看到的(非常小),我有多个地面,它们正在向左边移动。有时(我指的是随机的),跑步者会在两块石头之间颠簸,然后沿着地面向左跑。。。 (在截图上,我将跑步者放在中间,以便拍摄截图) 我写了一个小补丁,但我发现它非常[…]非常脏: public void fixWeirdCollisionBug() { body.setTransform(body.getPosition().x, bod

我正在创建一个跑步者游戏,下面是一个屏幕截图:

我把我的世界分成了几块,我遇到了碰撞问题。正如你在左下角看到的(非常小),我有多个地面,它们正在向左边移动。有时(我指的是随机的),跑步者会在两块石头之间颠簸,然后沿着地面向左跑。。。 (在截图上,我将跑步者放在中间,以便拍摄截图)

我写了一个小补丁,但我发现它非常[…]非常脏:

public void fixWeirdCollisionBug() {
    body.setTransform(body.getPosition().x, body.getPosition().y + transformToScreen(0.0002f), body.getAngle());
}
我将地面向上移动一点,跑步者在哪里,以避免在两个地面之间出现这种错误。事实上,我正在寻找一个更好的方法来做到这一点

我还有一个问题。我希望我的跑步者能够以正的x速度跳跃,这样他就能在地面上向前跑。我的场地是一个动态的身体,我的球员是一个动态的身体。我将玩家的摩擦力设置为0,这样他就可以保持初始状态,而不会“跟随”地面。问题是,我希望跑步者继续前进,并在跳跃时慢慢恢复到初始状态

我尝试了以下方法,但没有效果,跑步者一直在地上滑行:

public void jump() {
    if(!jumping) {
        System.out.println("Jump !");
        body.getFixtureList().get(0).setFriction(0.1f);
        body.applyLinearImpulse(getUserData().getJumpingLinearImpulse(), body.getWorldCenter(), true);
        jumping = true;
    }
}
当流道处于初始状态时:

if(body.getFixtureList().get(0).getFriction() != 0 && body.getPosition().x < Constants.RUNNER_X_DEFAULT) {
        System.out.println("reset friction");
        body.getFixtureList().get(0).setFriction(0);
        body.setTransform(Constants.RUNNER_X_DEFAULT, body.getPosition().y, body.getAngle());
        body.setLinearVelocity(0, 0); //also try to reset velocity to remove the sliding effect, but doesn't work
}
if(body.getFixtureList().get(0.getFriction()!=0&&body.getPosition().x
(这在运行程序的act()方法中)

我希望有人会发现我的代码有什么问题,因为它开始让我头痛。。。多谢各位


编辑:我尝试使用水平组来解决第一个问题的随机凹凸:不起作用…

听起来你遇到了“卡住”的问题。其他人也遇到了这个问题,并询问了这个问题,我怀疑许多其他人也遇到了同样的问题

iforce2d在他们的网站上做了一个测试。我喜欢iforce2d的评论并推荐阅读

我还解释了这个问题,以及如何解决这个问题。如果你喜欢我写的文章,请投我一票

TL;博士将链形状用于地面(使用边形状的可选相邻顶点)

至于第二个问题…

根据您所写的内容、添加的评论以及我为此所做的Box2D来源的一些回顾,我相信您遇到的问题是,更改夹具的摩擦力并不是为了更新现有触点的摩擦力

以下是与此相关的2.3.2来源中的声明:

/// Set the coefficient of friction. This will _not_ change the friction of
/// existing contacts.
void SetFriction(float32 friction);
检查
b2
的调用层次结构可以确认上述注释。混合摩擦函数仅在构造触点和调用触点的
ResetFriction
方法时调用。因此,当您的代码调用
setFriction
时,您没有看到预期的结果,我敢打赌,已经为该夹具构造了一个接触地面的触点


为了解决这个问题,从算法上讲,在改变夹具的摩擦力后,立即搜索该夹具的任何触点,并调用这些触点的重置摩擦力方法,以使这些触点识别新的混合摩擦力值。我相信在这种情况下,您可以使用fixture body的get contact list方法来获取要检查的联系人列表。然后遍历所有接触边,同时检查边的接触,以查看接触的固定装置中是否有一个是刚刚为其设置新摩擦力的固定装置。对于所有其夹具A或夹具B为问题夹具的触点,请调用其重置摩擦方法。

非常感谢,伙计,你让我开心!你知道我怎样才能把跑步者移回初始位置吗?我如何利用球员与地面之间的摩擦力?也许你需要一个更高的摩擦力值?不过这只是猜测而已。摩擦数可以达到浮点无穷大(几乎)。试着用1000.0的摩擦力来观察,然后根据你所看到的来计算。嗯,我不认为你理解这个问题,摩擦力确实很好,但是当我再次尝试将它设置为0时,玩家会在地面上不断滑动…:/你说得对。第二个问题我不清楚。我很想帮忙,但我对第二个问题感到困惑。如果角色的滑动超过了您的期望值,则摩擦力会更大。同样,较低的摩擦力也会增加滑动。根据记忆,这是两个接触装置之间的混合。我现在更新了我的回答,我相信这是您描述的第二个问题的原因和解决方案。