提问人:Copha 提问时间:11/15/2023 最后编辑:Mark RotteveelCopha 更新时间:11/15/2023 访问量:14
如何知道 ChainShape 的哪一侧正在发生碰撞?
How to know which side of a ChainShape is being collided with?
问:
我正在学习 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();
}
答:
0赞
londonBadger
11/15/2023
#1
您可以在接触时检查球的 x 位置,即 ballX < minX+margin 用于左侧,ballX >maxX-margin 用于右侧。
评论