LibGDX / Box2D:如何跟踪body之间的活动接触?



我正在使用Box2D与LibGDX一起制作2D(侧视图(汽车游戏。这辆车有一个前轮和一个后轮,它是"AWD"。我想在玩家"燃烧橡胶"时,在轮子接触地面的每个点上渲染灰尘效果。为此,我的计划是

  1. 实现联系人侦听器,并在beginContact(Contact contact(方法中找到其中一个夹具是接地的联系人,另一个是汽车的车轮。
  2. 将这些触点保存到一个(特定于轮子的
  3. (数组中,该数组应该包含轮子的活动触点(轮子可以在多个点上接触地面,因此需要一个数组(。
  4. 在每次渲染调用期间,对于每个轮子数组中的每个接触:获取接触位置,并计算轮体和该位置的地面主体之间的速度差。如果速度差矢量的长度大于某个阈值,则绘制尘埃效应(使用速度差矢量来定义尘埃粒子的速度和角度(。
  5. 当调用我的联系人侦听器的结束联系人(联系人联系人(时,从数组中删除联系人。

问题是 LibGDX 似乎对每个 Box2D 联系人都使用 SAME Contact 实例,重写现有的联系人,即使它仍然处于活动状态!这意味着,例如,如果后轮先接触地面,然后前轮接触地面,则我保存到后轮接触数组的 Contact 实例将被前轮的接触属性覆盖。另一个问题是,当我收到endContact时,我不知道哪个Contact真正结束了。

我是否理解错了什么,或者这就是 LibGDX 应该的行为方式?是否可以以某种方式调整此行为,或者是否有简单的解决方法?

(我想到的一个选择是继续收听beginContact和endContact呼叫,并跟踪接触每个车轮的地面主体/固定装置,但是然后我必须手动计算每帧的接触点,这听起来有些困难,昂贵且冗余 - 因为Box2D无论如何都会在每个世界步骤中计算它(。

也许你可以创建一个实现 ContactListener 类的 MyContactListener。

类包含一个 MyContactInventory 对象,该对象是一个包含联系人数组和几个方便方法的 Singleton 对象:

  • 添加联系人
  • 删除联系人

开始联系人和结束联系人使用上述方便的方法将联系人添加/删除到阵列中。

然后你调用world.setContactListener( new MyContactListener(((;

希望对您有所帮助!

最新更新