我使用不同形状进行碰撞检测(矩形
,圆形
,锥形
,环形
等等)。所有这些形状都派生自基本的抽象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类中进行大量的“if”检查和类型检查?
编辑:
请注意,检查形状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