我对 box2d 比较陌生,我使用的是 box2dweb 版本。我希望能够检测到运动物体何时离开了我的舞台边界。Box2D.Dynamics.b2BoundaryListener 是显而易见的答案,但 box2dweb 构建显然不支持它。
是否有一种有效的方法来创建侦听器,而不是在每次调用 update() 期间原始地检查每个主体的坐标?我尝试使用静态物体作为传感器,但它们不检测运动物体。
我对 box2d 比较陌生,我使用的是 box2dweb 版本。我希望能够检测到运动物体何时离开了我的舞台边界。Box2D.Dynamics.b2BoundaryListener 是显而易见的答案,但 box2dweb 构建显然不支持它。
是否有一种有效的方法来创建侦听器,而不是在每次调用 update() 期间原始地检查每个主体的坐标?我尝试使用静态物体作为传感器,但它们不检测运动物体。
据我所知,b2BoundaryListener 是 Box2D 早期版本的一部分,并且由于 Box2D 世界不再有边界而被删除。
您可以使用动态传感器,因为这些传感器也可以检测运动体。如果你的世界使用重力,你将不得不修复身体。
您可以通过施加抵消重力的力或通过接头(例如焊接接头)将这些动态传感器主体固定到静态主体来做到这一点。
较新的 Box2D Javascript 端口还包括 setGravityScale 方法,该方法允许您创建不受重力影响的动态物体(例如JSBox2D)
但我认为在更新中手动执行此操作可能是一个更好的主意,并且如果您使用 b2AABB 类应该非常简单。当它们的边界框超出您的范围时,这将删除对象。
您可以执行以下操作(未经测试的代码):
var body = world.GetBodyList();
while (body != null) {
var fixture = body.GetFixtureList();
var bodyIsInBounds = false;
while (fixture != null) {
// bounds AABB are your boundaries (as b2AABB object)
if (fixture.GetAABB().TestOverlap(boundsAABB)) {
bodyIsInBounds = true;
break;
}
fixture = fixture.GetNext();
}
if (!bodyIsInBounds) {
world.DestroyBody(body);
}
body = body.GetNext();
}
您可能还需要检查 b2AABB.Contains。如果 boundsAABB 完全包含另一个 b2AABB 对象,我不确定 TestOverlap 是否会返回 true。