想要检查两个物品是否在太空中碰撞。为此目的,两个项目都由一些简化的几何形状表示 - 为简单起见,我们假设这些形状只能是圆形,多边形和线条。物品可以由任何这些形状表示,并且碰撞检测需要能够处理任何可能的组合。我想找到一种涉及最少代码重复的策略,并允许将来添加更多形状。
我的方法如下:
if (textBox6.Visible == true)
{
textBox6.Visible = false;
} else {
textBox6.Visible = true;
}
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
}
}
其中Collidable是任何几何形状的界面,可能的形状如下:
public class Item{
private Collidable bounds;
public boolean checkCollision(Item target){
return bounds.checkCollision(target.getBounds());
}
}
然而,这会产生大量的代码重复(相同的圆线碰撞算法需要在Line类中重复)并且似乎不是优雅。我在寻找解决方案时研究了不同的设计模式,但最终只得到了这种类似策略的解决方案。这里有什么更好的方法?
答案 0 :(得分:1)
使用Visitor pattern恢复self._current_split
类型的信息。
圆圈无法知道正在检查哪个图形的碰撞,但图中知道它。让我们通过double dispatching找到它。
您可以重命名这些方法,但其含义应保持不变。您还可以将这些方法标记为Collidable
,以便不能在不同的上下文中调用它们。
您可以将检查特定对的方法委托给外部静态类,以避免代码重复。
internal
答案 1 :(得分:0)
也许您的碰撞检测不属于形状类。相反,您可以实现一组碰撞算法类,每个形状组合一个。然后代码只存在于一个地方。
您需要某种方法来选择正确的算法。您可以将它们保存在由形状名称键入的地图中,或者仅将相关的注入到每个形状中。
现在,当一个形状必须决定它是否与另一个形状碰撞时,它会找到正确的碰撞算法并要求答案。