Libgdx 和 Box2d 奇怪的碰撞

Libgdx and Box2d Strange Collision

所以现在我正在尝试制作一款游戏,让您保持 运行 正确并且必须跳过障碍。我已经做到了,地面由两个大块组成,当你在第二个块的四分之一处时,第一个块移动到第二个块的前面。这是我的代码。

    public void updateGround(){
    if(player.getPosition().x >= blocks[1].getGeneratePoint()){
        //swap the blocks in the array
        Block tempblock = blocks[0];

        blocks[0] = blocks[1];
        blocks[1] = tempblock;

        Body body1 = blocks[0].getBody();
        blocks[1].getBody().setTransform(body1.getPosition().x+(gBlockSize*2)/B2DVars.PPM,
                0,0);
    }
}

我想对此进行压力测试,所以我将块大小设置得有点小,然后将其保留 运行 但我注意到过了一会儿我的家伙停止了 运行。我通过使用 b2drenderer 和其他测试意识到玩家以某种方式与第二个块接触并且它在第二个块开始的地方停止。

这是某种错误还是我做错了什么?我确定地面块不会改变它们的 y 值或它们的角度会导致它们的设置为 0,我什至尝试过让地面块进入彼此,但玩家仍然停在第二个块开始的地方。

需要考虑的一件事是精度。如果你 运行 这在很长一段时间内浮动不准确堆积起来,事情开始表现得有点奇怪。一般来说,如果你要在一个方向上做一些事情 运行 无限长的时间,在某些时候最好 'shift' 整个世界回到更小的数字范围内,这样就不会出现不准确的情况流行。

如果您使用 'transforms' 执行这些操作而不是明确地为您的角色设置严格的值,您将特别看到这一点。

尝试引入世界转变,看看是否能为您解决问题:)

相反,如果这不起作用,请尝试引入框边缘的轻微重叠。当您使用 'overly precise' 系统时,边界条件通常会遇到一些问题。

这是 Box2d 众所周知的问题 - 两个物体接触点存在问题 - 它通常表现为其中一个稍高(即使它们具有相同的大小和位置)并且与 box2d 精度相关.

避免这种情况的最佳方法是使用 ChainShape 创建地面

简单的代码示例操作方法是:

    //float[] vertices - array with vertices of shape: [x1, y1, x2, y2...]
    Vector2[] worldVertices = new Vector2[vertices.length / 2];

    for (int i = 0; i < vertices.length / 2; ++i) {
        worldVertices[i] = new Vector2();
        worldVertices[i].x = vertices[i * 2] / PPM;
        worldVertices[i].y = vertices[i * 2 + 1] / PPM;
    }

    ChainShape chain = new ChainShape(); 
    chain.createChain(worldVertices);

您也可以在这里阅读:http://www.box2d.org/manual.html

此致, 迈克尔

解决方案 1 如果您为播放器使用盒子:

如果您想保留盒子,请使用如下图所示的多边形:

这样你的玩家就不会卡在盒子的边缘并被推上去而不是与边缘碰撞。

解决方案 2

非常简单,只需要为播放器的 "feet" 使用一个圆圈即可。