Catch Collision Events
It took my a while to understand this part of JigLibX. It's neither complete nor the best way, but i figured out, that this works. Feel free to comment, correct, edit and add your own ideas. i don't mind :)
What it's all about?
This small advice is about handling if two objects collide. Well, JigLibX does it's part and simulates physical behavior, but for a game or other program you will need to do something, if a spaceship collides with an enormous alien-cockroach or cars hit each other. I figured out, there are at least two ways. Unfortunately i can't say, which one has better performance or is better for your application ( here someone, who has mastered JigLibX could edit a bit ).
1. Use callback functions
Use this, if you want to set collision behaviour for single or multiple objects. First there is created a function which will be applied to one or more objects and is executed each time a collison occurs.
1.1 Create callback-function
This function needs to return a boolean value. If you return true, phyicengine will process upcoming collision, else it is ignored as if collidee is something like a ghost, which you can pass through. It needs to parameters, which will be given by callback. First is your object(=owner) and second is object it's colliding with (=collidee). You can specify behaviour for special objects or classes of objects.
public bool handleCollisionDetection(CollisionSkin owner, CollisionSkin collidee)
{
// here is handled what happens if your Object collides with another special Object (= OtherObject)
if (collidee.Equals(OtherObject.Skin)) {
// YourObject hits OtherObject ( or vice versa) and Collision is processed
return true;
}
else if (collidee.Equals(GhostObject.Skin)){
// this time you'll be able to walk through Ghost-like object
return false;
}
// all other collisions will be handled by physicengine
return false;
}
1.2 Apply callback-function to an object
Now you can use this function for all objects you want. That's it.
YourObject.Skin.callbackFn += new CollisionCallbackFn(handleCollisionDetection);
2. Use CollisionInfos
This time, we will specify a list of objects to check for collision. Using callbackfunction gives you an event, but there is a lack of information like how depp is intersection… Here you can do much more than in previous example.
2.1 Preparation
We need a CollisionFunctor, which does check for collision-pairs ( it tests for all possible pairs just one time), a list ob Bodys, which shall be tested and another list to store for each collision a CollisionInfo.
List<Body> bodyList = new List<Body>(); // add all bodies, which should be checked to this list
List<CollisionInfo> collisionInfos = new List<CollisionInfo>(); // this is filled by collisionfuntor
CollisionFunctor collisionFunctor = new BasicCollisionFunctor(collisionInfos); // as parameter pass CollisionInfo-List
2.2 Detect Collisions
Detect collisions in an update routine ( e.g. world update).
collisionSystem.DetectAllCollisions(bodyList, collisionFunctor, null, 0.05f);
Last step is to do something with collected collisionInfo. Still in Update add something like this:
if (collisionInfos.Count > 0) // check if there are new collisionInfos
{
foreach (CollisionInfo info in collisionInfos)
{
// e.g. you can output number of collisionPoint, and Seperation Velocity. You can get much more infos of CollisionInfo!
Console.WriteLine(info.NumCollPts + " " + info.PointInfo[0].MinSeparationVel);
}
// clear list, else you cannot decide which CollisionInfos are new or old
collisionInfos.Clear();
}
i hope this helps a bit.
neverdowell





