使用一个语句检测多个对象

时间:2014-05-22 10:36:00

标签: c# winforms visual-studio-2012

我正在winforms做一个小游戏。我知道winforms并不是制作游戏的真正原因。然而,以我喜欢的方式学习自己的OOP只是一个小项目。

所以问题是。我想检测网格图上的碰撞。所以我的计划是用Collision标记它们然后我必须编写一百万条语句,因为你需要在访问标记之前引用控件。而且因为它是在瓷砖中积累的,所以它们都有不同的名称。

有没有办法通过某种标签或其他方式检测具有不同名称的多个对象。

小图画(尝试)简化了我的问题。

Example

因此,我希望播放器能够与所有的c碰撞,而不必编写多个if语句。

因此,如果所有的c都有一种方法来识别它们。这将是一个非常简单的if语句。

1 个答案:

答案 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
                    }
                }
            }
}