如何防止多次触发接触监听器?
How to prevent multiply triggering contact listener?
在我的游戏中,我使用了很多包含多个固定装置的 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
在我为 body 的每个灯具分配唯一的用户数据之后。
新日志:
...
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
我找到了解决问题的办法。我添加了一个变量,其中包含碰撞状态。
代码:
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;
}
}
...
我不知道你的固定装置是如何设置的,但很可能你的恢复原状可能是问题所在(弹性)。尝试增加/减少它。这将减少您的身体如此快速地轻微弹跳的可能性。
在我的游戏中,我使用了很多包含多个固定装置的 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
在我为 body 的每个灯具分配唯一的用户数据之后。
新日志:
...
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
我找到了解决问题的办法。我添加了一个变量,其中包含碰撞状态。 代码:
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;
}
}
...
我不知道你的固定装置是如何设置的,但很可能你的恢复原状可能是问题所在(弹性)。尝试增加/减少它。这将减少您的身体如此快速地轻微弹跳的可能性。