2012-07-24 70 views
0

因此,我想从地图边缘(即矩形)弹出一些圆圈,但它们不应该互相反弹。如何限制DynamicBody不会彼此反弹(但仍然发生碰撞)?

问题是,我仍然需要捕捉圆圈碰撞并对这些事件执行一些任务。

任何人都可以指出我应该去的方向吗?

对于澄清:

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

我试过的是在联系开始时为两个圆圈设置归零,并在联系结束时恢复恢复(在我的ContactListener子类中)。也试过临时设置的圆圈作为传感器。但我不确定它为什么不起作用。

+1

http://stackoverflow.com/questions/11062252/how-to-detect-collision-but-do-not-collide-in-box2d – iforce2d 2012-07-25 06:04:42

回答

0

感谢iforce2d的评论,我能找到在以下线程正确答案:How to detect collision but do not collide in box2d?

如问题:我想对碰撞事件作出反应,但要圆不是在同一时间互相碰撞。所以,传感器不是答案,也不是改变身体的物理属性。正确的答案是禁用preSolve方法的CollisionListenercontact.setEnabled(false))。就那么简单。

0

从一个高层次的时候,你会编程,这样的事情在你的应用程序逻辑:

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

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

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

+0

Sven,感谢您的反馈,但这实际上并不是我的问题的答案(但是我可能不够精确 - 首先我开始使用Box2D为了不重新发明轮子:已经与自己的,非常简单的物理学挣扎,但它很快就开始恼人地增加功能[而且表现很漂亮不好]]。 – lukaszb 2012-07-24 22:37:11

3

您可以为您的圈子设置过滤条件,以便它们与地图边缘发生碰撞,但不会与自身发生碰撞。如何做到这一点,你可以阅读box2d手册http://www.box2d.org/manual.html,在“过滤”部分。

为了捕捉圆圈圈的碰撞,你接下来可以做:

  1. 在每一步的世界的foreach你的圈子中一个接一个。
  2. 查看某个圆圈时,通过它的AABB进行AABB查询。什么是AABB查询以及如何在“AABB查询”部分查看box2d手册。要获得圆的AABB,请调用b2Fixture :: GetAABB。
  3. 经过AABB查询后,您会得到灯具的数量,可能与您的圈子发生碰撞。要测试某些特性,请使用b2TestOverlap函数,或者简单计算中心之间的距离。

祝你好运!