【问题标题】:Libgdx and Box2d Strange CollisionLibgdx 和 Box2d 奇怪的碰撞
【发布时间】:2015-08-26 19:59:04
【问题描述】:

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

    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,我什至尝试过让地面块相互进入,但玩家仍然会在第二块开始的地方停下来。

【问题讨论】:

    标签: libgdx box2d


    【解决方案1】:

    这是 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

    问候, 米哈乌

    【讨论】:

    • 感谢您的帮助,这让我发疯了。
    【解决方案2】:

    要考虑的一件事是精度。如果你在很长一段时间内运行它,浮动不准确就会堆积起来,事情开始变得有点奇怪。一般来说,如果你要让某物在一个方向上运行无限长的时间,那么在某些时候最好将整个世界“转移”回较小的数字范围,其中不准确的情况不那么普遍。

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

    尝试引入一个世界转变,看看是否能为你清理它:)

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

    【讨论】:

    • 我尝试了重叠方法,但它不起作用,我试图准确地更改值,但现在它只是不动。还有你所说的世界转移是什么意思?
    【解决方案3】:

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

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

    这样,您的播放器就不会卡在盒子的边缘,并因与边缘碰撞而被推上去。

    解决方案 2

    非常简单,只需使用一个圆圈来表示播放器的“脚”。

    【讨论】:

      猜你喜欢
      • 2013-03-17
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多