2011-12-10 6 views
7

obj-cには比較的新しいので、何かが欠落しているはずですが、敵が壁に衝突するとプログラムがクラッシュします。私はループの中で敵を取り除いているところに位置していましたが、私の人生では、どうやって修正するのか分かりません。 私のコードは以下の通りである:コレクション<__ NSArrayM:0x76c11b0>は列挙中に突然変異しました

(エラーがある "[allEnemies REMOVEOBJECT:enemyType1];")

//常に実行 - (ボイド)更新:(ccTime)DT {

for (CCSprite *enemyType1 in allEnemies) { //for every attacking unit in allEnemies 

    //Adjust the collison box for each enemey depending on the height of the enemy 
    float a; 
    float b; 
    float yOne = (wall.contentSize.height-enemyType1.position.y); 
    float yTwo = (wall.contentSize.height); 
    float xTwo = 30; 
    a = (xTwo*(yOne/yTwo)); // always < 1 
    b = xTwo-a;    // always > 1 


    //Create the altered collison box 
    CGRect enemyType1Rect = CGRectMake (
       enemyType1.position.x - (enemyType1.contentSize.width/2), 
       enemyType1.position.y - (enemyType1.contentSize.height/2), 
       enemyType1.contentSize.width+b, 
       enemyType1.contentSize.height 
             ); 


    //If the enemey hits the wall, stop it, then add it to the attacking enemies array 
    if (CGRectIntersectsRect(enemyType1Rect, wall.boundingBox)) { 
     [enemyType1 stopAllActions]; 
     [allEnemies removeObject:enemyType1]; 
     [attackingEnemies addObject:enemyType1];    
    } 


} 
//Wall Collison END 

答えて

24

エラー状態と同じように、列挙されている間に配列を変更しました。最も簡単な修正はfor (CCSprite *enemyType1 in [[allEnemies copy] autorelease])です。この方法で配列のコピーを列挙します(これは要素をコピーせず、それらを列挙する別のコンテナを与えます)。そして、変更可能な配列を変更することができます。

コンテナを列挙している間は、コンテナを変更することはできません。

+0

OK、あなたはそれがまったく同じものを説明することができ。 [allEnemies copy]は配列のコピーを作成しますが、それを元の "allEnemies"配列から削除します。また、そこに「autorelease」を置くと、「[allEnemies removeObject:enemyType1];」を持つ必要はありません。右?申し訳ありませんが、これは本当にダム(私はちょうどxcode 4を持っていて、これは私の3を悩ませていない)。 編集: そのコードを変更したところ、次のようになりました。 com.yourcompany.StromTheHouseをブートストラップサーバーに登録できませんでした。エラー:不明なエラーコード。 – user1091516

+0

xcodeは私を嫌っています。だから、私は([allEnemies copy autorelease]のCCSprite * enemyType1)を取得すると思いますが、ブートストラップエラーは表示されませんが、今Deviceでテストしようとすると新しいエラーが発生します: StormTheHouse [11129:707] cocos2d:画像を追加できませんでした:壁。CCTextureCacheのpng 2011-12-10 11:02:05.888 StormTheHouse [11129:707] ***アサーションエラー - [HelloWorld addChild:]、/Users/rauhul/Desktop/Invasion/libs/cocos2d/CCNode.m: 385 2011-12-10 11:02:05.890 StormTheHouse [11129:707]キャッチされていない例外 'NSInternalInconsistencyException'のためアプリを終了しています、理由: '引数は非nilでなければなりません' – user1091516

+0

nvmこれらの投稿私はコード内でwall.pngを参照していましたが、イメージはWALL.png、Thx soooo much – user1091516

4

問題は次のコード行にあります。[allEnemies removeObject:enemyType1]; 配列allEnemiesを列挙していて、問題の原因となっている列挙体の配列からオブジェクトを削除しています。他の配列を実際に(removeObject:)に変異させながら、ループのために一時配列を使用する必要があります。

0

NSMutableArrayにオブジェクトを追加し、その配列からレコードを読み込んでいるときに、これも起こる可能性があります。そして、これらの2つのタスクは2つの異なるスレッドで起こっています。 1つはバックグラウンドスレッドで起きており、もう1つはメインスレッドで起きているようです。スレッドにも注意してください。

2

NSMutableArrayからアイテムを削除することはできません。

これにはいくつかの解決策があります。

  • 反復配列

または

  • のコピーは、インデックスベースforループの代わりに、for each構文を使用しますが。

は配列をコピーしないあなたに配分し、いくつかのCPUサイクルを保存します。

for (int i = updatedLocalityArray.count-1 ; i >= 0 ; i--) 
{ 
    NSString *test = updatedLocalityArray[i]; 
    if ([test isEqualToString:tableViewCell.textLabel.text]) 
    { 
     [updatedLocalityArray removeObjectAtIndex:i]; 
     NSLog(@"%@ *****", updatedLocalityArray); 
    } 
} 
関連する問題