Java 如何限制DynamicBody不相互反弹(但仍然碰撞)?

Java 如何限制DynamicBody不相互反弹(但仍然碰撞)?,java,box2d,libgdx,Java,Box2d,Libgdx,因此,我有一些圆,我想从地图的边缘反弹(即矩形),但它们不应该相互反弹 问题是,我仍然需要捕获圆碰撞并对此类事件执行一些任务 有人能告诉我该走的方向吗 请澄清: 我使用的是libGDX和Box2D,圆是动态体。在地图的中间可能有一些静止的物体,这些圆圈通常也应该与它们(从它们的弹跳处)结成。 我尝试的是在接触开始时将两个圆的恢复设置为0,并在接触结束时恢复恢复(在我的ContactListener子类中)。还尝试将临时设置的圆圈用作传感器。但是,我不确定它为什么不起作用。从高级角度来看,您应该在

因此,我有一些圆,我想从地图的边缘反弹(即矩形),但它们不应该相互反弹

问题是,我仍然需要捕获圆碰撞并对此类事件执行一些任务

有人能告诉我该走的方向吗

请澄清:

我使用的是libGDX和Box2D,圆是动态体。在地图的中间可能有一些静止的物体,这些圆圈通常也应该与它们(从它们的弹跳处)结成。
我尝试的是在接触开始时将两个圆的恢复设置为0,并在接触结束时恢复恢复(在我的ContactListener子类中)。还尝试将临时设置的圆圈用作传感器。但是,我不确定它为什么不起作用。

从高级角度来看,您应该在应用程序逻辑中编写类似的程序:

使用一些if条件从贴图反弹:例如,检查圆心的x值减去半径是否小于贴图的x分量;如果是这种情况,则反转圆运动矢量的x方向

两个圆的碰撞检测只是两个圆心之间的连接向量长度与两个半径之和的比较;如果较小或相等,则它们彼此相交

编辑:
哦,对不起,我没有看到你使用某种物理图书馆。我没有使用libgdx,但在其他框架中,您可以定义冲突组,指定哪些对象可以相互冲突,然后相应地处理这些组中对象的冲突。也许libgdx也提供了类似的概念?

从高级角度来看,您可以在应用程序逻辑中编写类似的程序:

使用一些if条件从贴图反弹:例如,检查圆心的x值减去半径是否小于贴图的x分量;如果是这种情况,则反转圆运动矢量的x方向

两个圆的碰撞检测只是两个圆心之间的连接向量长度与两个半径之和的比较;如果较小或相等,则它们彼此相交

编辑:
哦,对不起,我没有看到你使用某种物理图书馆。我没有使用libgdx,但在其他框架中,您可以定义冲突组,指定哪些对象可以相互冲突,然后相应地处理这些组中对象的冲突。也许libgdx也提供了类似的概念?

您可以为圆设置过滤器,这样它们将与地图的边缘碰撞,但不会与其自身碰撞。如何做到这一点,您可以阅读box2d手册的“过滤”部分。

要捕获圆碰撞,可以执行以下操作:

  • 在世界的每一步,一个接一个地走向你的圈子
  • 当看到某个圆时,通过它的AABB进行AABB查询。什么是AABB查询以及如何使其查看“AABB查询”部分的box2d手册。要获取圆的AABB,请调用b2Fixture::GetAABB
  • 在AABB查询之后,您将获得可能与您的圆碰撞的装置的计数。要测试某些属性,请使用b2TestOverlap函数,或简单地计算中心之间的距离。

  • 祝你好运

    您可以为圆设置过滤器,这样它们将与地图的边缘碰撞,但不会与自身碰撞。如何做到这一点,您可以阅读box2d手册的“过滤”部分。

    要捕获圆碰撞,可以执行以下操作:

  • 在世界的每一步,一个接一个地走向你的圈子
  • 当看到某个圆时,通过它的AABB进行AABB查询。什么是AABB查询以及如何使其查看“AABB查询”部分的box2d手册。要获取圆的AABB,请调用b2Fixture::GetAABB
  • 在AABB查询之后,您将获得可能与您的圆碰撞的装置的计数。要测试某些属性,请使用b2TestOverlap函数,或简单地计算中心之间的距离。

  • 祝你好运

    感谢iforce2d的评论,我可以在下面的帖子中找到正确的答案:


    正如问题中所说:我想对碰撞事件做出反应,但不要让圆圈同时相互碰撞。所以,传感器不是答案,也改变了物体的物理属性。正确的答案是在CollisionListener的预解决方法中禁用contact(contact.setEnabled(false))。就这么简单。

    感谢iforce2d的评论,我可以在下面的帖子中找到正确的答案:


    正如问题中所说:我想对碰撞事件做出反应,但不要让圆圈同时相互碰撞。所以,传感器不是答案,也改变了物体的物理属性。正确的答案是在CollisionListener的预解决方法中禁用contact(contact.setEnabled(false))。就这么简单。

    Sven,谢谢你的反馈,但这实际上并不是我问题的答案(不过,我可能一开始不够精确-我开始使用Box2D是为了不重新发明轮子:我已经在为自己的、极其简单的物理做斗争,但很快就开始讨厌添加功能(而且表现也很差。)斯文,谢谢你的反馈,但这并不是我问题的答案(然而,一开始我可能不够精确——我开始使用Box2D是为了不重新发明轮子:我已经在自己的、极其简单的物理上挣扎,但很快就开始讨厌添加功能[而且性能也很差])。