6. Colisiones - nelsonmoreno/Box2d GitHub Wiki
Box2D detecta cuándo y cómo un objeto colisiona con otro y a partir de allí simula los eventos propios del sistema, con el fin de permitir al programador generar nuevos comportamientos a partir de una colisión Box2D proporciona una manera fácil para ser notificado en el momento en que dos cuerpos entran en contacto, cuando se detienen en contacto e incluso promociona la cantidad de impulso ejercida en cada cuerpo.
b2ContactListener
El tipo b2ContactListener del API Box2d provee 4 funciones callBack para notificar los 4 eventos que ocurren en una colisión:
-
BeginContact
: este evento es lanzado cuando dos objetos entran en contacto. -
EndContact
:este evento es lanzado cuando dos objetos que estaban en contacto se apartan hasta finalizan su contacto. -
PreSolve
:este evento permite al programador sobre escribir el comportamiento natural de uno de lo objetos involucrados en la colisión, bien sea agregando nuevas características, modificando las actuales o incluso cancelando esta. -
PostSolve
: este evento nos permite obtener información sobre una colisión, luego de que esta ha ocurrido, por ejemplo nos permite saber la cantidad de impulso, la posición y dirección de un objeto. Supongamos que debemos decidir si una flecha se que queda pegada de la diana luego de que esta colisiona, pero para ello es requerido que la flecha halla impactado con la punta, que el impulso si halla sido el suficiente y que el ángulo sea este dentro de un rango mínimo.
El siguiente fragmento muestra el uso de las funciones callBack:
var listener = new Box2D.Dynamics.b2ContactListener;
listener.BeginContact = function(contact) {
console.log(contact.GetFixtureA().GetBody().GetUserData() + " begin contact");
}
listener.EndContact = function(contact) {
console.log(contact.GetFixtureA().GetBody().GetUserData() + " end contact");
}
listener.PostSolve = function(contact, impulse) {
console.log(contact.GetFixtureA().GetBody().GetUserData() + " post solve contact, impule value="+impulse.normalImpulses[0]);
}
listener.PreSolve = function(contact, oldManifold) {
console.log(contact.GetFixtureA().GetBody().GetUserData() + " pre solve contact");
}
world.SetContactListener(listener);
Aquí puedes ver el código completo y la demostración , recuerda que abrir los logs de la consola de javascript -> si usas Chrome: https://developer.chrome.com/devtools/docs/console