1

我对 box2d 比较陌生,我使用的是 box2dweb 版本。我希望能够检测到运动物体何时离开了我的舞台边界。Box2D.Dynamics.b2BoundaryListener 是显而易见的答案,但 box2dweb 构建显然不支持它。

是否有一种有效的方法来创建侦听器,而不是在每次调用 update() 期间原始地检查每个主体的坐标?我尝试使用静态物体作为传感器,但它们不检测运动物体。

4

1 回答 1

0

据我所知,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。

于 2014-05-14T22:08:42.680 回答