【问题标题】:Detect multiple objects with one statement用一个语句检测多个对象
【发布时间】:2014-05-23 00:11:54
【问题描述】:

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

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

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

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

所以基本上我希望玩家 p 能够与所有 c 发生冲突,而不必编写多个 if 语句。

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

【问题讨论】:

  • 将所有cs 放在一个数组中。遍历数组。
  • @Dan-o 那静物需要做很多工作,没有更好的方法吗?

标签: c# winforms visual-studio-2012


【解决方案1】:

如果 C 是 UserControls,您可以在 Form 的 Load-event 中以编程方式将它们添加到列表中。

列出所有 cUserControls:

List<cUserControl> cElements = new List<cUserControl> cElements = this.Controls.OfType<cUserControlItem>().ToList()

然后在表单的 "Shown" 事件中运行它:

foreach (Control c in this.Controls)
{
   if (c is cUserControl) { cElements.Add(c); }
}

在此之后,您可以遍历这个填充列表。在您在表单中编辑或添加更多 C 之后,它始终是最新的。每次玩家移动时,检查是否与创建列表中的任何 C 发生碰撞。你也可以用 foreach-loop 来做到这一点。你只需要找到一种方法来检测它们是否发生碰撞。

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

【讨论】:

  • 小心:foreach (T t in someCollection) 不会将someCollection 过滤到T 类型的项目。相反:如果表单上有任何控件 not cUserControlItem,您的代码将失败。你可能想写的是:List&lt;cUserControl&gt; cElements = this.Controls.OfType&lt;cUserControlItem&gt;().ToList().
  • 用@Heinzi 的例子更新了这段代码,还添加了碰撞代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 2021-02-12
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多