реализация граничного прослушивателя в box2dweb

Я относительно новичок в box2d, я использую версию box2dweb. Я хочу иметь возможность определять, когда кинематические тела выходят за пределы моей сцены. Box2D.Dynamics.b2BoundaryListener является очевидным ответом, но, по-видимому, он не поддерживается сборкой box2dweb.

Есть ли эффективный способ создать прослушиватель вместо примитивной проверки координат каждого тела при каждом вызове update()? Я пытался использовать статические тела в качестве датчиков, но они не обнаруживают кинематические тела.


person user3636139    schedule 14.05.2014    source источник


Ответы (1)


Насколько мне известно, 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. Я не уверен, вернет ли TestOverlap значение true, если boundsAABB полностью содержит другой объект b2AABB.

person Dennis Korbar    schedule 14.05.2014