我正在winforms做一个小游戏。我知道winforms并不是制作游戏的真正原因。然而,以我喜欢的方式学习自己的OOP只是一个小项目。
所以问题是。我想检测网格图上的碰撞。所以我的计划是用Collision标记它们然后我必须编写一百万条语句,因为你需要在访问标记之前引用控件。而且因为它是在瓷砖中积累的,所以它们都有不同的名称。
有没有办法通过某种标签或其他方式检测具有不同名称的多个对象。
小图画(尝试)简化了我的问题。
因此,我希望播放器能够与所有的c碰撞,而不必编写多个if语句。
因此,如果所有的c都有一种方法来识别它们。这将是一个非常简单的if语句。
答案 0 :(得分:2)
如果Cs是UserControls,您可以在Form的Load-event中以编程方式将它们添加到列表中。
列出所有cUserControls的列表:
List<cUserControl> cElements = new List<cUserControl> cElements = this.Controls.OfType<cUserControlItem>().ToList()
然后在表单的“已显示”事件中运行:
foreach (Control c in this.Controls)
{
if (c is cUserControl) { cElements.Add(c); }
}
在此之后,您可以遍历此填充列表。在您编辑或向表单添加更多C之后,它始终是最新的。每次玩家移动时,检查是否与创建的列表中的任何一个C相撞。您也可以使用foreach循环执行此操作。你只需要找到一种方法来检测它们是否发生碰撞。
foreach (cUserControl c in cElements)
{
int[][] pointData = new int[][]
{
new int[] { _control.Location.Y, _control.Location.Y + _control.Size.Height },
new int[] { _control.Location.X, _control.Location.X + _control.Size.Width }
};
foreach (Control sControl in cElements)
{
if (sControl == _control) continue;
if (sControl.Location.Y >= pointData[0][0] && sControl.Location.Y <= pointData[0][1])
{
if (sControl.Location.X >= pointData[1][0] && sControl.Location.X <= pointData[1][1])
{
// Match
}
}
}
}