0

このエラー メッセージが表示される理由を数日間探していました。そして、これを解決するか、コードを改善するために助けが必要です。なぜこのエラーが発生するのかを理解し、その理由を見つけるのは困難です。なぜなら、このエラーが常に発生するわけではなく、時々発生するからです! しかし、リストとリスト内のアイテムの数に関係していると思います。エラー イベントが発生するのは、コードの 2 番目の部分です。また、削除したいオブジェクトを特別な「削除リスト」に追加しようとしましたが、これが機能しないのはなぜですか? 助けていただければ幸いです。ありがとう!

public void CollisionControlMissileHitAsteroid(ContentManager content)
{
    for (int i = 0; i < missilesList.Count(); i++)
    {
        // Stora asteroider
        for (int j = 0; j < asteroidsBigList.Count(); j++)
        {
            if (missilesList.ElementAt(i).Bounds().Intersects(asteroidsBigList.ElementAt(j).Bounds())) // Fel här ??
            {

                for(int x = 0; x < 2; x++)
                AddNewSmallAsteroidToList(new AsteroidSmall(content, asteroidsBigList.ElementAt(j).Position));
                missilesList.RemoveAt(i);
                i--;

                asteroidsBigList.RemoveAt(j);
                j--;
            }
        }


        if (missilesList.Count() > 0 && asteroidsSmallList.Count > 0)
        {

            for (int k = 0; k < asteroidsSmallList.Count(); k++) 
            {
                if (missilesList.ElementAt(i).Bounds().Intersects(asteroidsSmallList.ElementAt(k).Bounds())) // THIS IS WHERE THE ERROR EVENT HAPPENS!
                {
                    missilesList.RemoveAt(i);
                    i--;
                    asteroidsSmallList.RemoveAt(k); 
                    k--;
                }
            }
        }
    } 
}

編集:

ここに休憩を入れるべきですか?それはまだ起こるので聞いてください!それが起こるまで、私は5分間遊ぶことができます!

if (missilesList.Count() > 0 && asteroidsSmallList.Count() > 0)
{

    for (int k = 0; k < asteroidsSmallList.Count(); k++) 
    {
        if (missilesList.ElementAt(i).Bounds().Intersects(asteroidsSmallList.ElementAt(k).Bounds())) 
        {
            missilesList.RemoveAt(i); 
            i--;
            asteroidsSmallList.RemoveAt(k);
            k--;
            break; // ???????
        }
    }
}
4

3 に答える 3

1

リストの境界に関係していると考えるのは正しいです。あなたが言うように、インデックスのリストを作成してループの外でそれらを削除する以外に、ループ内のリストアイテムまたは配列要素を削除する満足のいく方法を思いついたことはありません。そうは言っても、次のようにリストを逆にたどってみましたか-

for (int k = asteroidsSmallList.Count() - 1; k >= 0; k--) 
{
    ...
于 2012-07-19T09:08:55.263 に答える
0

1 つのミサイルと 2 つの小惑星から始めるとします。ミサイル (i=0) は最初の小惑星 (j=0) に衝突しますが、その後は i=-1 と j=0 に進みます。内側のループから抜け出し、代わりに外側のループの次の反復を続行する必要があります。結局のところ、ミサイルの「使用は終了」です。大小を問わず、他の小惑星に衝突することはありません。

(そして、はい、xanatos のコメントによるとCount、メソッドの代わりにプロパティを使用する方がより慣用的Count()です。)

于 2012-07-19T09:05:03.923 に答える
0

コードが for ループで実行されるため、問題は明らかだと思います。最初の for ループでは、i=0. 内部の私のコメントを読んでください

for (int i = 0; i < missilesList.Count(); i++)
    {
        // Stora asteroider
        for (int j = 0; j < asteroidsBigList.Count(); j++)
        {
            if (missilesList.ElementAt(i).Bounds().Intersects(asteroidsBigList.ElementAt(j).Bounds())) // Fel här ??
            {

                for(int x = 0; x < 2; x++)
                    AddNewSmallAsteroidToList(new AsteroidSmall(content, asteroidsBigList.ElementAt(j).Position));
                missilesList.RemoveAt(i);
                // In the first iteration of the outer for loop i=0, so what if the line below is executed
                // you will get negative index Hope this help
                i--;

                asteroidsBigList.RemoveAt(j);
                j--;
            }
        }
于 2012-07-19T09:10:59.240 に答える