【问题标题】:xna 4.0 perparing for multiple collision detection with listxna 4.0 使用列表进行多重碰撞检测
【发布时间】:2011-09-09 03:04:53
【问题描述】:

我有一个对象列表,其中的所有对象都有一个每次更新的边界矩形......我怎样才能有效地在它们之间进行迭代?我认为像这样检查它很好,但有什么想法吗?

        for (int i = 0; i < birds.Count; i++)
        {
            for (int j = 0; j < birds.Count; j++)
            {
                if (j > i)
                {
                    if (birds[j].boundingRectangle.Intersects(birds[i].boundingRectangle))
                    {

                                birds[i].tintColor = Color.Yellow;
                                birds[j].tintColor = Color.Yellow;

                    }
                    else
                    {

                            birds[i].tintColor = Color.White;
                            birds[j].tintColor = Color.White;

                    }
                }
            }
        }

【问题讨论】:

  • 此外,我的矩形每次都返回 Color.White... :(

标签: list xna collision


【解决方案1】:

我看不出为什么它无法检测到碰撞,代码似乎没问题。您应该输出一些显示边界矩形值的字符串,以查看它们是否设置正确,或者您是否正在执行该代码,或者您的“birds”数组是否在执行此代码的范围内存活(您可以正在修改副本而不是实际数组)。

至于改进,你可以这样做:

for (int j = i+1; j < birds.Count; j++)

然后您可以删除if (j &gt; i)(j 将始终> i)。 我建议的另一件事是不要在 for 声明中声明 int j。在外部声明它总是比在每个i 上实例化更好,所以:

int i, j;
for (i = 0; i < birds.Count; i++)
      for (j = i+1; j < birds.Count; j++)

如果不能使用指针,我认为那里没有更多的改进空间。无论如何,您的方法对于 2D 图形都很好,除非您要检查数百个对象。

PS:我相信您的问题适合 Game Development - SE 网站(除非您使用 XNA 和边界框来处理其他问题:P)

【讨论】:

    【解决方案2】:

    您的问题是,在比较矩形时,您将鸟设置为白色,即使它之前被之前的命中检测设置为黄色,所以它可能已设置为黄色,但如果上次测试失败。

    如何在每一帧的开始(碰撞检测之前)将矩形设置为白色,然后如果发生碰撞,将它们设置为黄色(如果没有碰撞,则不理会它们)。

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 2015-07-16
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      相关资源
      最近更新 更多