How to avoid tons of `instanceof` in collision detection?
- by Prog
Consider a simple game with 4 kinds of entities: Robots, Dogs, Missiles, Walls.
Here's a simple collision-detection mechanism in psuedocode: (I know, O(n^2). Irrelevant for this question).
for(Entity entityA in entities){
for(Entity entityB in entities){
if(collision(entityA, entityB)){
if(entityA instanceof Robot && entityB instanceof Dog) entityB.die();
if(entityA instanceof Robot && entityB instanceof Missile){
entityA.die();
entityB.die();
}
if(entityA instanceof Missile && entityB instanceof Wall) entityB.die();
// .. and so on
}
}
}
Obviously this is very ugly, and will get bigger and harder to maintain the more entities there are, and the more conditions there are.
One option to make this better is to have separate lists for each kind of entity. For example a Robots list, a Dogs list etc. And than check for collisions of all Robots with Dogs, and all Dogs with Walls, etc.
This is better, but I still don't think it's good.
So my question is:
The collision detection system spotted a collision. Now what?
What is the common way to react to the collision? Should the system notify the entity itself that it collided with something, and have it decide for itself how to react? E.g. entityA.reactToCollision(entityB).
Or is there some other solution?