utilizo varias formas para la detección de colisión (Rectangle
, Circle
, Cone
, Ring
etc.) Todas esas formas se derivan de la clase base abstracta Shape
. Mis objetos del juego tienen propiedad de tipo Shape.Diseño modelo para la comprobación de colisión entre las formas
class GameObject
{
(...)
public Shape CollisionShape { get; set; }
}
y durante el proceso de inicialización que decida qué forma se utilizará para cada objeto, como:
GameObject person = new GameObject();
person.CollisionShape = new Circle(100); // 100 is radius
Ahora cuando quiero comprobar si dos objetos se cruza utilizo la clase siguiente:
public class IntersectionChecker
{
public bool Intersect(Shape a, Shape b)
{
Type aType = a.GetType();
Type bType = b.GetType();
if(aType == typeof(Rectangle) && bType == typeof(Rectangle))
return Intersect(a as Rectangle, b as Rectangle);
if(aType == typeof(Rectangle) && bType == typeof(Circle))
return Intersect(a as Rectangle, b as Circle);
// etc. etc. All combinations
}
private bool Intersect(Rectangle a, Rectangle b)
{
// check intersection between rectangles
}
}
por lo que mi código es el siguiente:
IntersectionChecker ic = new IntersectionCHecker();
bool isIntersection =
is.Intersect(personA.CollisionShape, personB.CollisionShape);
¿Hay alguna forma mejor de lograr mi objetivo, sin docenas de controles 'if' y controles de tipo en la clase IntersectionChecker?
EDIT:
Por favor tome en cuenta, que el método que se compruebe la intersección entre la forma A y B se puede utilizar para comprobar la intersección entre B y A también. En muchas respuestas (¡gracias por todos sus pensamientos!), Se propone que la comprobación de intersección se invoque desde la propia forma en lugar del objeto IntersectionChecker. Creo que me obligará a duplicar el código. Ahora puedo hacer de la siguiente manera:
if(aType == typeof(Rectangle) && bType == typeof(Circle))
return Intersect(a as Rectangle, b as Rectangle);
if(aType == typeof(Circle) && bType == typeof(Rectangle))
return Intersect(b as Rectangle, a as Circle); // same method as above
Consulte mi propuesta para usar Reflection. Es fácil utilizar el mismo método para objetos de tipo Rectángulo/Círculo y Círculo/Rectángulo si usa Reflection para enviar la llamada. – Achim