на обработчики событий столкновения в box2djs - PullRequest
1 голос
/ 24 января 2012

Я играю с box2djs . Я пытаюсь найти способ написать функцию обратного вызова onCollision (), но документации немного, и я не могу найти очевидный способ сделать это.

Спасибо!

1 Ответ

1 голос
/ 25 января 2012

Обратный вызов для box2djs фактически упоминается как "фильтр" столкновения. Вот как вы можете это реализовать. Вместо этого я покажу, что я делаю, что, возможно, немного медленнее, но поскольку мой другой подход находится за пределами шага (), я могу уничтожать объекты и прочее:

// Called whenever a collision occurs in the world
//

var JellyCollisionCallback = function()
    {
    // Required function - this is the function the gets called when b2ContactManager registers a collision between two bodies
    //
    this.ShouldCollide = function( shape1, shape2 )
        {
        // These are the two bodies…
        //
        var cBody1 = shape1.m_body;
        var cBody2 = shape2.m_body;

        // I'm setting userData when I create the body object
        //
        var jellyObject1 = cBody1.GetUserData();
        var jellyObject2 = cBody2.GetUserData();


        // This is the code from the default collision filter
        //
        if (shape1.m_groupIndex == shape2.m_groupIndex && shape1.m_groupIndex != 0)
            {
            return shape1.m_groupIndex > 0;
            }

        var collide = (shape1.m_maskBits & shape2.m_categoryBits) != 0 && (shape1.m_categoryBits & shape2.m_maskBits) != 0;

        return collide;
        }

    return this;
    }


function createWorld()
    {
    var world = new b2World(worldAABB, gravity, doSleep);

    myCollisionCallback = new JellyCollisionCallback();

    world.SetFilter(myCollisionCallback );
    }

, вероятно, не так хорошо, как настоящий обратный вызов, но у меня изначально были проблемы с попыткой заставить работать обратный вызов, поэтому я написал этот подход и в итоге оставил его. Я делаю это в своем основном цикле, который вызывает world.step ()

// Find collisions between selected objects
//
// (world is the main b2World object)
//
var aContact;
for ( aContact = world.m_contactList; aContact != null; aContact = aContact.m_next )
    {
    var cBody1 = aContact.m_shape1.m_body;
    var cBody2 = aContact.m_shape2.m_body;

    // I'm setting userData when I create the body object
    //
    var jellyObject1 = cBody1.GetUserData();
    var jellyObject2 = cBody2.GetUserData();

    // Not one of my controlled Objects
    //
    if ( typeof(jellyObject1) != "object" || jellyObject1 == null )
        continue;
    if ( typeof(jellyObject2) != "object" || jellyObject2 == null )
        continue;

    // Call my collision event for the colliding objects
    //
    jellyObject1.dink();
    jellyObject2.dink();
    }
Документация

в значительной степени недоступна из того, что я нашел, но мне очень нравится box2djs, и я наконец-то понял все, что мне нужно для выполнения некоторых простых хобби-проектов. Вот несколько примеров, которые расширяют оригинальную демонстрацию box2djs jellyrobotics box2djs project

...