如何知道 ChainShape 的哪一侧正在发生碰撞?

How to know which side of a ChainShape is being collided with?

提问人:Copha 提问时间:11/15/2023 最后编辑:Mark RotteveelCopha 更新时间:11/15/2023 访问量:14

问:

我正在学习 LibGDX 并尝试使用 Box2D 进行碰撞和移动。我正在制作一个简单的乒乓球游戏。当球击中左边或右边的墙(即另一边得分)时,我希望球体被摧毁,并在屏幕中央换上一个新的球体。显然,当球击中顶部或底部时,这不应该发生。

我用 ChainShape 夹具创建了一个实体来表示游戏的边框。这条链有 4 个顶点并形成一个循环。我还创建了一个 ContactListener,用于处理边框和球之间的碰撞。问题是:如何仅在左壁或右壁发生碰撞时触发所需的行为?

在我看来,应该以某种方式隔离左墙或右墙,也许是作为 EdgeShape。但我找不到任何方法可以做到这一点。Contact、Fixture 和 ChainShape 似乎都没有相关的方法。我在网上也找不到任何关于这方面的信息。

以下是我目前拥有的 ContactListener 代码:

public final class CollisionListener implements ContactListener {
  @Override
  public void beginContact(Contact contact) {
    var fixtureA = contact.getFixtureA();
    var fixtureB = contact.getFixtureB();
    
    if (fixtureA.getUserData() != "border" && fixtureB.getUserData() != "border") {
      return;
    }

    //TODO: Only trigger for left and right walls

    var object = fixtureA.getUserData() == "border" ? fixtureB : fixtureA;
    Entity entity = (Entity)object.getUserData();

    // Logic for creating new body
  }
}

还有 ChainShape:

  private void createBorders() {
    var bodyDef = new BodyDef();
    bodyDef.type = BodyType.StaticBody
    bodyDef.position.set(0, 0);

    var body = world.createBody(bodyDef);

    var chain = new ChainShape();
    chain.createLoop(
      new Vector2[] {
        new Vector2(Constants.VIEWPORT_MAX_X, Constants.VIEWPORT_MAX_Y),
        new Vector2(Constants.VIEWPORT_MAX_X, Constants.VIEWPORT_MIN_Y),
        new Vector2(Constants.VIEWPORT_MIN_X, Constants.VIEWPORT_MIN_Y),
        new Vector2(Constants.VIEWPORT_MIN_X, Constants.VIEWPORT_MAX_Y)
      }
    );

    body.createFixture(chain, 0f);
    body.setUserData("border");
    chain.dispose();
  }
java libgdx 游戏-物理 box2d

评论


答:

0赞 londonBadger 11/15/2023 #1

您可以在接触时检查球的 x 位置,即 ballX < minX+margin 用于左侧,ballX >maxX-margin 用于右侧。