我使用碰撞檢測(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類中沒有幾十個'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
看到我的建議使用反射。如果使用反射來分派呼叫,則對於類型爲矩形/圓形和圓形/矩形的對象使用相同的方法很容易。 – Achim 2011-05-28 21:51:48