xna 4.0准备使用列表进行多次碰撞检测

时间:2011-09-06 16:22:24

标签: list xna collision

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

        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;

                    }
                }
            }
        }

2 个答案:

答案 0 :(得分:0)

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

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

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

然后您可以删除if (j > i)(j将始终为&gt; i)。 我建议的其他事情不是在int j语句中声明for。在每个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)

答案 1 :(得分:0)

您的问题是,在比较矩形时,您将鸟设置为白色,即使之前通过之前的命中检测将其设置为黄色,因此它可能已设置为黄色,但如果已将其设置为黄色,则会再次设置为黄色。最后一次测试失败。

在每个帧的开始(碰撞检测之前)如何将矩形设置为白色然后如果发生碰撞将它们设置为黄色(如果没有碰撞则将它们单独留下)。