我有一个对象列表,每次都有一个更新的边界矩形...我怎样才能有效地在它们之间进行迭代?我认为像这样检查它是好的,但任何想法?
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;
}
}
}
}
答案 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)
您的问题是,在比较矩形时,您将鸟设置为白色,即使之前通过之前的命中检测将其设置为黄色,因此它可能已设置为黄色,但如果已将其设置为黄色,则会再次设置为黄色。最后一次测试失败。
在每个帧的开始(碰撞检测之前)如何将矩形设置为白色然后如果发生碰撞将它们设置为黄色(如果没有碰撞则将它们单独留下)。