【发布时间】:2020-06-22 07:35:20
【问题描述】:
我正在使用 Box2D 使用 LibGDX 制作 2D(侧视图)汽车游戏。这辆车有一个前轮和一个后轮,它是“AWD”。当玩家“燃烧橡胶”时,我想为车轮接触地面的每个点渲染灰尘效果。为此,我的计划是
- 实现 ContactListener,并在 beginContact(Contact contact) 方法中找到其中一个固定装置接地而另一个固定装置为汽车车轮的联系人。
- 将这些联系人保存到(车轮特定的)数组中,该数组应该包含车轮的活动联系人(车轮可以多点接触地面,因此需要一个数组)。
- 在每次渲染调用期间,对于每个车轮阵列中的每个接触:获取接触位置,并计算该位置的车轮主体和地面主体之间的速度差。如果速度差矢量的长度大于某个阈值,则绘制尘埃效果(使用速度差矢量来定义尘埃粒子的速度和角度)。
- 当我的 ContactListener 的 endContact(Contact contact) 被调用时,从数组中删除联系人。
问题在于 LibGDX 似乎为每个 Box2D 联系人使用相同的联系人实例,即使它仍然处于活动状态,也会重写现有的联系人!这意味着,例如,如果后轮首先接触地面,然后是前轮,那么我保存到后轮接触数组中的 Contact 实例将被前轮的接触属性覆盖。另一个问题是,当我收到 endContact 时,我不知道哪个 Contact 真正结束了。
我是不是理解错了,或者这就是 LibGDX 的行为方式?是否有可能以某种方式调整此行为,或者是否有简单的解决方法?
(我想到的一个选择是继续收听 beginContact 和 endContact 呼叫,并只跟踪接触每个车轮的地面物体/固定装置,但是我必须在每一帧手动计算接触点,这听起来有点困难、昂贵和多余 - 因为 Box2D 无论如何都会在每个世界步骤中计算它)。
【问题讨论】: