Libgdx和Box2d奇怪碰撞

Libgdx和Box2d奇怪碰撞,libgdx,box2d,Libgdx,Box2d,所以现在我想做一个游戏,让你保持正确的跑动,并且必须跳过障碍物。我已经这样做了,地面是由两个大街区组成的,当你在第二个街区的第四个路口时,第一个街区会移动到第二个街区的前面。这是我的代码 public void updateGround(){ if(player.getPosition().x >= blocks[1].getGeneratePoint()){ //swap the blocks in the array Block temp

所以现在我想做一个游戏,让你保持正确的跑动,并且必须跳过障碍物。我已经这样做了,地面是由两个大街区组成的,当你在第二个街区的第四个路口时,第一个街区会移动到第二个街区的前面。这是我的代码

    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);
    }
}
我想对它进行压力测试,所以我把块的大小弄得很小,然后让它继续运行,但我注意到,过了一段时间,我的家伙停止了运行。通过使用B2D和其他测试,我意识到玩家不知何故接触到了第二个方块,它就停在第二个方块开始的地方


这是某种错误还是我做错了什么?我知道,无论是地面块改变他们的Y值或它们的角度导致他们的设置为0,我甚至试着使地面块进入彼此,但玩家仍然停止在第二块开始。

< P> >一件事是考虑精度。如果你在很长一段时间内运行它,浮动误差会堆积起来,事情开始变得有点奇怪。一般来说,如果你想让某个东西在一个方向上运行无限长的时间,那么在某个时刻,最好将整个世界“转移”到更小的数字范围内,在这些范围内,不准确的情况并不普遍

如果您使用“转换”执行这些操作,而不是显式地为角色设置精确的值,您将特别看到这一点

尝试引入一个世界性的转变,看看这是否会为你清理干净:)


相反,如果这不起作用,请尝试引入框边的轻微重叠。通常,在使用“过于精确”的系统时,边界条件可能会遇到一些问题。

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

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

简单代码示例操作指南:

    //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);
//float[]顶点-具有以下形状顶点的数组:[x1,y1,x2,y2…]
Vector2[]世界顶点=新的Vector2[Vertexts.length/2];
对于(int i=0;i
您也可以在此处阅读:

问候,,
Michał

解决方案1如果您为玩家使用了一个盒子:

如果不想保留长方体,请使用如下图所示的多边形:

这样你的球员就不会被卡在禁区边缘而被推上,而不是与禁区边缘发生碰撞

解决方案2


非常简单,只需为玩家的“脚”使用一个圆圈。

我尝试过重叠方法,但不起作用,我尝试精确更改值,但现在它不动了。还有,你说的世界转变是什么意思?谢谢你的帮助,这让我发疯了。