在Box2d和libgdx(Android)中检测两个物体之间的碰撞。

3
我是libgdx和Box2d引擎的新手,正在使用它们开发游戏。我想检测两个物体之间的碰撞以执行某些功能。但我不知道最佳方法,并且还想获取碰撞点。请提供一些带有代码的建议。我已经实现了ContactListener,但没有成功。我正在使用此代码作为参考:this。谢谢。
1个回答

8

您已经正确地创建和设置了ContactListener...(对于一般设置,libgdx wiki非常好:https://github.com/libgdx/libgdx/wiki/box2d#contact-listeners

如果您现在想处理特定的联系,例如,您需要在侦听器的beginContact();方法中添加一些实现。 beginContact();方法包含一个Contact实例,其中包含您所需的所有信息:

  • FixtureA - 联系的第一个fixture
  • FixtureB - FixtureA发生碰撞的fixture
  • WorldManifold - 一个包含碰撞点等信息的对象

通过fixtures,您可以访问绘制的bodies和actors。通过body.setUserData(actor);方法可以将其与Actor连接起来。

现在您需要决定如何找到正确的碰撞。您可以使用传感器,这是仅充当传感器的box2d固件。这意味着当物体与传感器发生碰撞时,它不会反弹,而是穿过它落下。但您随后可以在侦听器中检测到此联系。
另外,将某种GameObjectType添加到您的演员中可能是个好主意。想象一下,您创建了一个跳跃游戏,在水下有平台,玩家从平台跳到平台上。然后,您将使用像PLAYER、WATER、PLATFORM之类的类型创建演员...通过box2d身体的getUserData()方法,您现在可以访问演员并比较它们的类型。
例如,当类型为PLAYER的Actor与类型为WATER的Actor发生碰撞时,他将淹死...
希望对您有所帮助...

感谢您的可行答案。如果您能就传感器提供更多的代码或解释,那将非常有帮助。 - Jigar Pandya
body.getUserData 究竟返回什么? - Jigar Pandya
传感器是一种不会与其他物体发生碰撞的夹具。您可以像将其他夹具添加到主体一样将其添加,但在FixtureDef中设置isSensor标志。运行模拟时,其他对象将穿过传感器而不会发生碰撞和反弹。但是在ContactListener中,您可以使用isSensor()检查发生碰撞的一个夹具是否为传感器... - florianbaethge
getUserData() 将返回您设置的用户数据。在我的项目中,我通常有一个扩展 GroupGameObject 类... 它包含一个 Body 元素。当然,这样做并没有将渲染和模拟分开,但它很方便且易于使用... 在 GameObject 的子类中创建夹具和身体时,我使用 setUserData(this) 方法,将 GameObject 本身作为用户数据添加到 box2d 身体中。这样,我可以通过对 ContactListenergetUserData() 的结果进行转换来访问 GameObject - florianbaethge
1
非常感谢 @evident。 - Jigar Pandya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接