2012-01-04 5 views
1

私は常に衝突検知をチェックしています。敵が殺されるたびに、配列から取り除きます。iPhoneゲーム:敵を列挙する

これは私に、突然変異の例外を与えている、これを解決するための通常の方法は何ですか?

人々は配列のコピーを作成するように話しましたが、私がそれを繰り返しているときには、考え方がばかげているように見えます。

+2

これらの要素を追加して別の配列に削除する方法はありますか?次に、元の配列を列挙した後、元の(最初の)配列から2番目の配列のすべての要素を削除するだけです。 – Till

答えて

3

私はTillのコメントに同意します。 self.enemiesあなたはトリッキーなことができ超えるitteratingされている配列から項目を削除し、元の可変配列

NSArray * enemiesToRemove = [[NSMutableArray alloc] init]; 
for (Enemy * enemy in self.enemies) { 
    if ([enemy colidesWithBullet]) { 
     [enemiesToRemove addObject:enemy]; 
    } 
} 
[self.enemies removeObjectsInArray:enemiesToRemove]; 
[enemiesToRemove release]; 
+0

2回目の 'for'ループを書くのではなく、次のようにします:' [self.enemies removeObjectsInArray:enemiesToRemove]; ' – jlehr

+0

まったく!私は私の答え、thxを編集するつもりです:) – Zoleas

1

基本的には、列挙されている間に配列を削除または追加することはできませんし、頻繁に配列を反復しているように見えるので、この例外が多く発生します。配列の@synchronizedブロックを使用して削除すると、これは反復処理中に配列を変更しないことを保証します...このアプローチの面倒な点は、反復処理と追加/削除操作がお互いに待っていることです。

@synchronized(myArray) 
{ 
    //iterate through myArray 
} 

@synchronized(myArray) 
{ 
    //mutate the array 
} 
1

であれば、そのようなことを行います。 Zoleasが示唆したようなことができます。リストの列挙を避け、最後の要素から開始し、最初に削除する必要のある要素を削除することができます。この方法で、後の要素のインデックスに影響を与える要素を決して削除しないようにすることができます。

for(int i=[array count]-1; i >=0 :i--) 
{ 
    bool needsRemoved = /* your code here */; 
    if (needsRemoved) 
    { 
    [ary removeObjectAtIndex:i] 
    } 
} 
+0

それは賢いです:) – Zoleas

関連する問題