【问题标题】:How to prevent multiply triggering contact listener?如何防止多次触发接触监听?
【发布时间】:2018-06-28 18:06:00
【问题描述】:

在我的游戏中,我使用了很多 Box2D 实体,其中包含多个固定装置。 而且我还使用 Contact Listener 来检测不同物体之间的碰撞。 不幸的是,我遇到了一个可怕的问题。当身体发生碰撞时,Contact Listener 会检测到不止一次。如何去抖动 Contact Listener? 我的日志:

...
postSolve A: brows B: bShape
endContact A: brows B: bShape
endContact A: brows B: bShape
endContact A: brows B: bShape
endContact A: brows B: bShape
endContact A: brows B: bShape
endContact A: brows B: bShape

在我为我身体的每个固定装置分配唯一的用户数据之后。

新日志:

...
endContact A: f-3 B: f-0
endContact A: f-4 B: f-0
endContact A: f-5 B: f-0
endContact A: f-7 B: f-0

【问题讨论】:

    标签: java libgdx box2d


    【解决方案1】:

    我不知道您的固定装置是如何设置的,但您的恢复原状可能是问题(弹性)。尝试增加/减少它。这将减少您的身体如此快速地弹开非常轻微的可能性。

    【讨论】:

      【解决方案2】:

      我找到了解决问题的方法。我添加了一个变量,其中包含碰撞状态。 代码:

      public class CollisionController implements ContactListener {
      
      private boolean collided;
      
      ...
      
      
      @Override
      public void beginContact(Contact contact) {
          collided = false;
      }
      
      @Override
      public void endContact(Contact contact) {
          if (!collided && contact.getFixtureA().getUserData() != null && contact.getFixtureB().getUserData() != null) {
              // CODE
              collided = true;
          }
      }
      
      ...
      

      【讨论】:

      • 如果它对您有用,请将其标记为解决方案,以便其他人可以从中受益。它是选票左侧的绿色勾号。