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

时间:2017-04-13 18:58:52

标签: java android libgdx box2d runner

我正在创建一个亚军游戏,这是一个截图: screenshot1

我把我的世界分成几块,我遇到了碰撞问题。正如你在左下角看到的(非常小),我有多个地面,他们向左移动。有时(有时,我的意思是随机)跑步者在两个大块之间颠簸并跟随左边的地面...... screenshot2 (在屏幕截图中我将跑步者放在中间,所以我可以截取屏幕截图)

我为此写了一点修复,但我发现它非常非常脏:

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
}

(这是在跑步者的act()方法中)

我希望有人会发现我的代码出了什么问题,因为它开始让我头疼...非常感谢

编辑:我尝试使用Horizo​​ntalGroup来解决随机颠簸:不起作用

1 个答案:

答案 0 :(得分:1)

关于第一个问题......

听起来你遇到了“陷入困境”的问题。其他人也遇到了这个问题并询问了它here,我怀疑很多其他人也遇到了同样的问题。

write-up of this problem and how it can be worked-around由iforce2d在他们的网站上完成。我喜欢iforce2d的写作并建议阅读它。

我也对这个问题进行了解释,以及如何解决这个问题,你可以找到here。如果你喜欢我的写作,请向上投票。

TL; DR ...使用地面的链形状(使用边缘形状的可选相邻顶点)。

关于第二个问题......

根据你所写的内容,你添加的评论,以及我为此所做的Box2D资源的一些回顾,我相信你遇到的问题是改变灯具的摩擦力不是为了更新现有联系人的摩擦而设计的。

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

/// Set the coefficient of friction. This will _not_ change the friction of
/// existing contacts.
void SetFriction(float32 friction);

检查b2MixFriction的调用层次结构确认上述注释。混合摩擦功能仅在构建联系人和调用联系人ResetFriction方法时调用。因此,当您的代码调用setFriction并且您没有看到您期望的结果时,我会打赌已经为该夹具接触地构建了一个联系人。

要解决这个问题,从算法上讲,在更改夹具的摩擦力之后,搜索此夹具的任何触点并调用这些触点的复位摩擦方法,以使这些触点识别新的混合摩擦值。我相信在这种情况下你可以使用fixture主体的get-contact-list方法来获取要检查的联系人列表。然后迭代所有接触边缘,同时检查边缘的接触,以查看接触器的任何一个夹具是否是刚刚为其设置新摩擦力的夹具。对于夹具-A或夹具-B 所讨论的夹具的所有触点,请调用它们的复位摩擦方法。