所以这应该很容易解决,但我无法弄明白。 (我在2015年的Visual Studios中使用XNA。我知道它有点过时了)
我拥有的是敌人名单(来自敌人类)。每个敌人都被分配一个碰撞矩形,如果一个敌人与另一个敌人的碰撞盒相交,他们就会停止移动。 我想使用类似于for循环的东西。
for (int i = 0; i < spawnAmount; i++)
{
if (enemies[i].collisionRect.Intersects(enemies[].collisionRect))
enemies[i].allActive = false;
}
所以在空白区域(敌人[]应该有一个值),有没有办法使用敌人列表中的所有值(即敌人[1,2,3,4,5])减去敌人[i]?否则敌人会检测到自己的碰撞盒并且无论如何都要停下来。它不必局限于几行,但越不复杂越好。
答案 0 :(得分:2)
嵌套循环......
for (int i = 0; i < spawnAmount - 1; i++)
{
for (int j = i + 1; j < spawnAmount; j++)
{
if (enemies[i].collisionRect.Intersects(enemies[j].collisionRect))
{
enemies[i].allActive = false;
}
}
}
所以你开始经历敌人。假设spawnAmount是5。
因此,对于i = 0
,您需要比较0 -> 1
,0 -> 2
,0 -> 3
和0 -> 4
。
i = 1
,您比较1 -> 2
,1 -> 3
,1 -> 4
i = 2
,您比较2 -> 3
,2 -> 4
i = 3
,您比较3 -> 4
您不需要对i=4
的任何内容进行比较,因为无论如何您都会覆盖它们,因为每次迭代都会在j
开始i+1
,它们永远不会无论如何都是一样的。
答案 1 :(得分:0)
您想使用Except
LINQ扩展名(来自System.Linq
)。
唯一的问题是你需要传递一个集合,所以你的代码应该是这样的:
Enemy[] exclusionList = new Enemy[1]; //Construct outside of loop for efficiency
for (int i = 0; i < spawnAmount; i++)
{
Enemy currentEnemy = enemies[i];
exclusionList[0] = currentEnemy;
if (enemies.Except(exclusionList).Any(e => e.collisionRect.Intersects(currentEnemy.collisionRect))
enemies[i].allActive = false;
}
您可以完全用一些聪明的LINQ替换for循环,并且还应该考虑将远处的敌人添加到排除列表中,因为您显然不会与他们冲突。
@MattWhitfields答案实际上更有效率,因为此代码将敌人1与敌人0 和相反,反之亦然,这绝对不是必需的。您可以构建一个更聪明的排除列表来解决此问题,或者使用他描述的for循环。