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

时间:2012-07-24 22:15:21

标签: java box2d libgdx

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

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

有人能指出我应该去的方向吗?

澄清:

我使用的是libGDX和Box2D,圈子是DynamicBodies。在地图的中间可能会有一些静态物体,这些物体通常也应该与它们共存(从它们反弹)。

我尝试的是在联系开始时将两个圆圈的恢复原状设置为0,并在联系结束时恢复恢复原状(在我的ContactListener子类中)。还试过临时设置圆圈作为传感器。但不知道为什么它不起作用。

3 个答案:

答案 0 :(得分:3)

您可以为圈子设置过滤器,因此它们会与地图边缘碰撞,但不会与自身发生碰撞。如何执行此操作,您可以在box2d手册http://www.box2d.org/manual.html的“过滤”部分阅读。

要捕捉圆圈碰撞,您可以执行下一步:

  1. 在每个世界步骤中逐个推进您的圈子。
  2. 查看某个圈子时,请通过它的AABB进行AABB查询。什么是AABB查询以及如何在“AABB查询”部分查看box2d手册。要获得圆圈的AABB,请调用b2Fixture :: GetAABB。
  3. 在AABB查询之后,您将获得可能与您的圈子发生冲突的灯具数量。要测试一定,请使用b2TestOverlap函数,或简单计算中心之间的距离。
  4. 祝你好运!

答案 1 :(得分:0)

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

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

两个圆的碰撞检测只是两个中心之间连接矢量长度与两个半径之和的比较;如果它小或相等,它们相互交叉。

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

答案 2 :(得分:0)

感谢iforce2d的评论我可以在以下帖子中找到正确答案:How to detect collision but do not collide in box2d?

在问题中:我想对碰撞事件作出反应但是让圈子不会同时相互碰撞。因此,传感器不是答案,也没有改变物体的物理属性。正确的答案是在 CollisionListener contact.setEnabled(false) preSolve 方法中禁用联系人。就这么简单。