【问题标题】:LIBGDX - collision issue and sliding effect issueLIBGDX - 碰撞问题和滑动效果问题
【发布时间】:2017-09-10 00:30:29
【问题描述】:

我正在创建一个跑步游戏,这是一个屏幕截图: 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 来解决随机颠簸:不起作用

【问题讨论】:

    标签: java android libgdx box2d runner


    【解决方案1】:

    关于第一个问题……

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

    write-up of this problem and how it can be worked-around 由 iforce2d 在他们的网站上完成。我喜欢 iforce2d 的文章,推荐阅读。

    我还解释了这个问题以及如何解决它,您可以找到here。如果你喜欢我的文章,请给它投票。

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

    关于第二个问题……

    根据您所写的内容、您添加的 cmets,以及对我为此所做的 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 并且您没有看到您期望的结果时,我敢打赌已经为该固定装置与地面建立了一个触点。

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

    【讨论】:

    • 非常感谢你,你让我开心!您知道如何将跑步者移回初始位置吗?我怎样才能发挥球员与地面之间的摩擦力?
    • 也许您需要更高的摩擦值?这只是一个猜测。摩擦数可以上升到浮点无穷大(几乎)。尝试 1000.0 进行摩擦,然后根据您所看到的进行操作。
    • 嗯,我想你没有理解问题,摩擦确实很好,但是当我再次尝试将其设置为 0 时,玩家一直在地面上滑动......:/跨度>
    • 你是对的。第二个问题我不是很清楚。我想帮忙,但我对第二个问题感到困惑。如果角色滑动的次数超出您的预期,则更高的摩擦力应该会减少这种情况。同样,较低的摩擦力应该会增加所见的滑动。根据记忆,这是两个接触装置之间的混合。
    • 我现在更新了我的回复,我认为这是您描述的第二个问题的原因和解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多