我对box2d比较新,我使用的是box2dweb版本。我希望能够发现运动物体何时退出舞台的边界。 Box2D.Dynamics.b2BoundaryListener是显而易见的答案,但显然不支持box2dweb build。在box2dweb中实现边界监听器
有没有一种有效的方法来创建一个侦听器,而不是在每次调用update()期间初始检查每个body的坐标?我尝试使用静态物体作为传感器,但它们不检测运动物体。
我对box2d比较新,我使用的是box2dweb版本。我希望能够发现运动物体何时退出舞台的边界。 Box2D.Dynamics.b2BoundaryListener是显而易见的答案,但显然不支持box2dweb build。在box2dweb中实现边界监听器
有没有一种有效的方法来创建一个侦听器,而不是在每次调用update()期间初始检查每个body的坐标?我尝试使用静态物体作为传感器,但它们不检测运动物体。
据我所知,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。