看到您如何确定您的误报是由身体与另一个人接触引起的,为什么不在您的 ContactListener 的 beginContact 方法中添加几行,将身体的当前速度存储在其用户数据中?然后您可以在 isStopped 方法中检查该速度。如果有一个存储的速度并且当前速度不是更大,这意味着身体正在反弹它击中的任何东西:忽略。如果有存储的速度并且当前速度更大,则球已反弹并朝某个新方向前进:清除存储的速度。如果没有存储速度并且当前速度低于您的阈值,则您已检测到所寻求的情况。
在您的 ContactListener 中:
public void beginContact(Contact contact) {
Body a = contact.getFixtureA().getBody();
Body b = contact.getFixtureB().getBody();
if (a == mBall) {
a.setUserData(a.getLinearVelocity().len());
} else if (b == mBall) {
b.setUserData(b.getLinearVelocity().len());
}
}
在您的 isStopped 检查中:
public Boolean isStopped() {
float storedSpd = (Float) body.getUserData();
float currentSpd = body.getLinearVelocity().len();
if ((storedSpd > Float.MIN_VALUE) && (currentSpd > storedSpd)) {
body.setUserData(Float.MIN_VALUE);
return false;
} else {
return (currentSpd < THRESHOLD);
}
}
这是未经测试的,但你明白了。另外,请记住最初将用户数据设置为 Float.MIN_VALUE。