我对box2d比较陌生,我使用的是box2dweb版本。我希望能够检测到运动学物体何时离开了舞台的边界。Box2D.Dynamics.b2BoundaryListener是显而易见的答案,但box2dweb build显然不支持它。
有没有一种有效的方法来创建侦听器,而不是在每次调用update()的过程中原始地检查每个主体的坐标?我试着用静态物体作为传感器,但它们不能检测到运动物体。
发布于 2014-05-15 06:08:43
据我所知,b2BoundaryListener是Box2D早期版本的一部分,由于Box2D世界不再有界限,因此被删除了。
您可以使用动态传感器,因为这些传感器也可以检测运动学物体。如果你的世界使用重力,你将不得不修复身体。
您可以通过施加抵消重力的力或通过关节(例如焊接接头)将这些动态传感器主体固定到静态主体来实现这一点。
较新的Box2D Javascript端口还包括setGravityScale方法,允许您创建不受重力影响的动态体(例如JSBox2D)
但我认为在update中手动执行此操作可能是一个更好的主意,如果您使用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。
https://stackoverflow.com/questions/23651759
复制相似问题