Обратный вызов для 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