我正在使用libgdx和box2d来检测碰撞,但有些碰撞我希望被检测到但力量不会产生影响。
例如,我想检测角色与硬币的碰撞,但又不希望硬币影响玩家的移动。
是否可以通过box2d实现这一点?如果可以,如何操作呢?
例如,我想检测角色与硬币的碰撞,但又不希望硬币影响玩家的移动。
是否可以通过box2d实现这一点?如果可以,如何操作呢?
我不确定您想要做什么,但如果我理解您的意图,您可以创建一个传感器装置类型,以下是一个伪代码示例:
FixtureDef fd1 = new FixtureDef();
//fd1.friction = 0.5f;
PolygonShape pSTest = new PolygonShape();
//size you want for example:
pSTest.setAsBox(4f / PIXEL_POR_METRO,
1f / PIXEL_POR_METRO,
new Vector2(22f / PIXEL_POR_METRO, -1f / PIXEL_POR_METRO),
0f);
fd1.shape = pSTest;
fd1.isSensor = true;
yourBody.createFixture(fd1).setUserData("yourId");
看起来需要使用ContactListener接口,例如preSolve方法。
注意,对于传感器,这个方法不会被调用。
提示:
setAsBox(float hx, float hy, Vector2 center, float angle)
Parameters:
hx the half-width.
hy the half-height.
center the center of the box in local coordinates.
angle the rotation in radians of the box in local coordinates.
引用自:https://gamedev.stackexchange.com/a/22542
在 Box2D 手册中了解碰撞过滤:
碰撞过滤允许您防止夹具之间的碰撞。 例如,假设您制作了一个骑自行车的角色。您希望自行车与地形发生碰撞,并且角色与地形发生碰撞,但您不希望角色与自行车发生碰撞(因为它们必须重叠)。Box2D 使用类别和组支持此类碰撞过滤。
Box2D 支持 16 种碰撞类别。对于每个夹具,您可以指定它属于哪个类别。您还可以指定该夹具可以与哪些其他类别发生碰撞。例如,在多人游戏中,您可以指定所有玩家不会相互碰撞,怪物也不会相互碰撞,但是玩家和怪物应该相互碰撞。
手册链接 here。(搜索 Filtering)
BodyFixture.setSensor(true)
后,“Coin”(在我的例子中)的身体将生成begin/endContact
回调,但不会影响碰撞的物体 - 所以“Character”只是无影响地穿过。 - Townsfolk