Я использую различные формы для обнаружения столкновений (Rectangle
, Circle
, Cone
, Ring
и т. Д.) Все эти формы получены из базового абстрактного класса Shape
. Мои игровые объекты имеют свойство типа Shape.
class GameObject
{
(...)
public Shape CollisionShape { get; set; }
}
и во время процесса инициализации я решаю, какая форма будет использоваться для каждого объекта, например:
GameObject person = new GameObject();
person.CollisionShape = new Circle(100); // 100 is radius
Теперь, когда я хочу проверить, пересекаются ли два объекта, я использую следующий класс:
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
}
}
так мой код выглядит так:
IntersectionChecker ic = new IntersectionCHecker();
bool isIntersection =
is.Intersect(personA.CollisionShape, personB.CollisionShape);
Есть ли лучший способ достичь моей цели без десятков проверок «если» и проверок типов в классе IntersectionChecker?
EDIT:
Имейте в виду, что метод проверки пересечения формы A и B может использоваться для проверки пересечения между B и A, а также. Во многих ответах (спасибо за все ваши мысли!) Предлагается проверка пересечения из самой фигуры, а не из объекта IntersectionChecker. Я думаю, что это заставит меня дублировать код. Теперь я могу сделать следующее:
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