1

配置されているオブジェクトと交差するリスト内のオブジェクトを検出して削除することになっているループがあります。コードは次のとおりです。

for (int i = 0; i < levelObjects.Count(); i++)
{
    if (levelObjects[i].BoundingBox.Intersects(mouseBlock.BoundingBox))
    {
        levelObjects.RemoveAt(i);
    }
}

複数の衝突がある状況に遭遇した場合、衝突を検出しないことがあります。交差機能は正常に機能しています。これを引き起こしているのは私のループについて何ですか?

4

4 に答える 4

5

ループから削除するため、要素をスキップすることになります。より良いオプションは、逆方向にループすることです。

for (int i=levelObjects.Count() - 1; i >= 0; --i)
{
  // ...

これにより、現在欠落している「スキップされた」オブジェクトが防止されます。削除すると、インデックスが下にシフトすると、すでにテストしたオブジェクトのみがシフトするためです。

于 2013-01-15T22:29:20.237 に答える
3

indexのオブジェクトを削除すると、indexiの値がindexにi + 1スライドダウンしますi。ループはインデックスに移動し、インデックスi + 1で新しい値をチェックすることはありませんi。これは、単に逆方向にループすることで回避できます。

于 2013-01-15T22:29:10.363 に答える
2

インデックスiのlevelObjectを削除すると、すべてがインデックスによって下にシフトされます。したがって、次のアイテムはインデックスiにあります。これを回避する簡単な方法は、最後から始めて、逆方向に作業することです。

for (int i = levelObjectsCount - 1; i >= 0; i--)
{
    if (levelObjects[i].BoundingBox.Intersects(mouseBlock.BoundingBox))
    {
        levelObjects.RemoveAt(i);
    }
}
于 2013-01-15T22:30:07.363 に答える
1

繰り返しているリストから削除することはできません!コピーを繰り返すか、アイテムのリストを作成して削除し、後で削除します。例(パフォーマンスが問題にならない場合):

foreach (var obj in levelObjects.ToList())
{
    if (obj.BoundingBox.Intersects(mouseBlock.BoundingBox))
    {
        levelObjects.Remove(obj);
    }
}
于 2013-01-15T22:29:24.523 に答える