2012-12-30 50 views
0

我一直在研究一款遊戲,並且我沒有除去敵方遊戲對象的問題(現在它們從CCSprite分類,我知道這不是最好的方法)Cocos2d NSMutable Array在枚舉時發生了變異

但我不知道我改變了什麼,使它在程序試圖從_targets加入targetsToDelete後嘗試removeChild時發生崩潰。

我嘗試過移動東西,我只是不知道如何在創建數組時添加或編輯數組......任何幫助或建議都會很棒!

而實際上,如果您有任何關於如何最好地創建遊戲敵人的指針,您是否劃分NSObjectCCNode?我聽說將它們分成組件類,但我不知道它們的含義。

//Projectile Target collision 

-(void)update:(ccTime)dt { 

    for (spygot *target in _targets) { 
     CGRect targetRect = CGRectMake(
             target.position.x - (target.contentSize.width/2), 
             target.position.y - (target.contentSize.height/2), 
             target.contentSize.width, 
             target.contentSize.height); 

     //Collision Detection Player 
     CGRect playerRect2 = CGRectMake(
             _controlledSprite.position.x - (_controlledSprite.contentSize.width/2), 
             _controlledSprite.position.y - (_controlledSprite.contentSize.height/2), 
             _controlledSprite.contentSize.width, 
             _controlledSprite.contentSize.height); 

    NSMutableArray *projectilesToDelete = [[NSMutableArray alloc] init]; 
    for (Projectile *projectile in _projectiles) 
    {   
     NSMutableArray *targetsToDelete = [[NSMutableArray alloc] init]; 

     CGRect projectileRect = CGRectMake(
              projectile.position.x - (projectile.contentSize.width/2), 
              projectile.position.y - (projectile.contentSize.height/2), 
              projectile.contentSize.width, 
              projectile.contentSize.height); 
     BOOL monsterHit = FALSE; 

     if (CGRectIntersectsRect(projectileRect, targetRect)) 
     { 
      NSLog(@"hit"); 
      target.mhp = target.mhp - 1; 
      monsterHit = TRUE; 

      if (target.mhp <= 0) 
      { 
       [targetsToDelete addObject:target]; 
      } 
     } 


     for (spygot *target in targetsToDelete) 
     { 
      [self removeChild:target cleanup:YES]; 
      [_targets removeObject:target]; 
     } 

     if (monsterHit) 
     { 
      [projectilesToDelete addObject:projectile]; 
     } 

     [targetsToDelete release]; 
    } 

    for (Projectile *projectile in projectilesToDelete) 
    { 
     [_projectiles removeObject:projectile]; 
     [self removeChild:projectile cleanup:YES]; 

    } 
    [projectilesToDelete release]; 
} 
+0

你寫道:「當[嘗試]從_targets中removeChild時崩潰」。爲了清楚起見,你的意思是說有問題的行是'[self removeChild:target cleanup:YES];''或'[_targets removeObject:target];'? –

回答

0

看起來你已經粘貼代碼全都來自_targets一個for循環迭代內。變量target如何得到初始化?

+0

是的,我意識到發生了崩潰,因爲我有一個單獨的調度程序啓動新的目標。當從'_targets'中同時移除'target'時,它總是會崩潰。很高興知道問題出在哪裏。但不知道如何解決它,我怎樣才能確保它們不會同時運行? – Julian

+0

局部變量'target'(它出現在你粘貼的代碼中)被初始化的行是什麼? –

+0

' - (void)addTarget { spygot * target =(nil); target = [spygot meowgot]; [_targets addObject:target]; [自的addChild:目標z:16];}' 並且這通過 '稱爲 - (無效)gameLogic:(ccTime)DT { [自addTarget]' 被調度在初始化 '[self schedule:@selector(gameLogic :) interval:1.0];' – Julian

0

通常當我得到這種錯誤是因爲我在一個塊中有代碼或者在一個模糊的線程中有其他方式。你有多確定這段代碼不會同時運行多次?

你可以試試下面的包裝它:

dispatch_async(dispatch_get_main_queue(), ^{ 
    // do everything here. 
}); 

至於有關使用CCSprite爲您的遊戲敵人對象的意見,我的建議是,當它成爲一個問題解決。你現在看到問題嗎?不成熟的優化幾乎和首先做錯了一樣糟糕。在項目結束時你會更清楚你應該如何早點完成它。 ;)

0

我想你知道在迭代它的時候你不能從數組中移除元素。這就是爲什麼你有targetsToDelete陣列。

但是在我看來,您確實很快就會移除目標。

試試這個: 完成迭代主循環並完成收集目標到targetsToDelete數組,並且只有在完成主循環後才能移除目標。

相關問題