当前位置: 首页 > 知识库问答 >
问题:

Libgdx box2D中的碰撞某些机构失败

潘雅珺
2023-03-14

我正在使用libgdx和box2d开发我的第一个游戏。我正在使用调试渲染器测试我的对象。我创造了一些类似汽车的物体。每辆车都有一个主体,它是一个由6个点组成的大多边形(约1米长,0.7米高),有两个轮子通过旋转关节连接。

主车有一门大炮和一把机枪,也通过旋转接头连接。

我面临的问题是,汽车的大部分没有按预期进行碰撞。当两辆车相互碰撞时,它们是重叠的,如下所示:

一些注意事项:

  1. 轮子和大炮(较小的形状)很好地碰撞。当轮子接触时,身体停止了
  2. 如果我通过代码检测到碰撞,则碰撞实际上正在发生
  3. 我用一个较小的物体(机关枪发射的子弹)尝试了这个,我将物体的“isBullet”属性设置为true,就像我在另一篇文章中看到的那样(box2d中没有正确的碰撞),但结果相同(子弹用红色圈出):

这是我用来创建身体的代码:

protected Body createBody(Material material, Shape shape, BodyType type, WorldWrapper world)
{
    BodyDef bodyDef = new BodyDef();
    bodyDef.type = type;
    bodyDef.position.set(initialPosition);

    Body body = world.createBody(bodyDef);

    FixtureDef fixtureDef = new FixtureDef();
    fixtureDef.density = this.material.getDensity();
    fixtureDef.friction = this.material.getFriction();
    fixtureDef.restitution = this.material.getRestitution();
    fixtureDef.shape = shape;
    body.createFixture(fixtureDef);

    return body;
}

汽车前进时使用车轮上的电机旋转接头,其构造如下:

public void goForward()
{
    for (RevoluteJoint joint : wheelJoints)
    {
        joint.enableMotor(true);
        joint.setMotorSpeed(-this.engineSpeed);
        joint.setMaxMotorTorque(this.engineTorque);
    }
}

我使用以下值:

Density = 2500;
Restitution = 0;
Friction = 0.1;
BodyType = Dynamic;

我使用1/60秒的世界步,速度迭代=6和位置迭代=2

知道我错过了什么吗?

共有1个答案

赵英资
2023-03-14

汽车的主体(多边形)是凹的。Box2D对于凹多边形或顶点是否按顺时针顺序排列有问题。试着用两个矩形来造那些车,那应该行得通。

顺便说一句:你似乎使用了一个旧版本的libgdx。当前的libgdx夜猫子在polygon.set函数中有一个额外的算法,它自动计算给定顶点的逆时针顺序的凸包。所以使用那个版本也应该能解决你的问题。

 类似资料:
  • 我的新想法是使用9个点,围绕我的玩家对象,并检查这些点中的哪一个是在瓷砖的界限内。一个点在每个角落,每边和一个在中心。每种瓦片类型将使用一组不同的规则来处理冲突。 然而,每种瓦片类型都必须使用一组复杂的条件语句来进行冲突测试--可能过于复杂。有什么指导吗?

  • 我正在开发一款平台游戏,我想做一些基本的平台碰撞,遗憾的是我还是做不到。玩家的移动是这样计算的: 所有变量都是具有< code>x和< code>y值的向量。这和预期的一样,问题是有冲突。我的规则是: 当降落在平台上时停止坠落。 从平台运行时开始下降。 在跳跃过程中击中平台时停止向上移动。 撞墙时停止向一侧移动,但能够向相反方向移动。 检查底部是否与平台碰撞非常简单,但棘手的部分是检测哪一侧与平台

  • 我正在尝试做一个平台游戏,其中没有斜坡。我正在尝试将碰撞检测降下来,但是我在pygame中找不到一种方法来获得哪一边与另一个Sprite发生了碰撞。有没有人能给我一个好的方法来做到这一点,那不是太庞大,但也能很好地工作在我的情况? 下面是我的玩家类: 我已经将它添加到我的player类中,每次播放器更新时我都运行它,并且它工作...差一点。 在平台顶部的碰撞起作用,在侧面的碰撞几乎总是起作用,除非

  • 我已经寻找并找到了单个碰撞的答案,但我正在寻找一种检测多种类型的碰撞的方法。我正在制作一个游戏,其中有3个我想要的碰撞。用户飞机与敌方子弹相撞,用户子弹与敌机相撞(我已经工作过),敌方子弹与用户子弹相撞。我已经设置并更正了所有类别BitMask和contactTestBitMask。这是我的委托方法。

  • 下面的测试会导致随机崩溃。大多数时候我都不知所措。 附带的代码是fun login(凭据:LoginCredentials){_LoginLivedata.value=LoginResult.Loading(true) Java.lang.AssertionError:验证失败:发生的调用少于订单验证序列所要求的调用。 匹配器:观察者(#94).OnChanged(eq(Loading(value

  • 你是否看到过车祸?是否跟什么物体相撞过?就像车的相撞一样,刚体对象也可以互相碰撞,当它们互相接触的时候,就认为发生了碰撞。当碰撞发生时,会触发一系列事件,它可以被完全忽略。 碰撞筛选 碰撞筛选允许你启用或者阻止形状之间碰撞的发生,引擎支持使用类型,组位掩码来进行碰撞筛选。 Cocos2d-x 有 32 个支持的碰撞类型,对于每个形状都可以指定其所属的类型。还可以指定有哪些类型可以与这个形状进行碰撞