2013-04-18 87 views
0

我正在研究一個cocos2d項目,並希望使用一組精靈。從NSMutable陣列中刪除精靈

我創建數組:

NSMutableArray *ssprites; 

然後我在init方法中添加的東西給它:

CCSprite *obssprite = [CCSprite spriteWithFile:@"/Users/Desktop/Programs/physics test/physics test/Resources/[email protected]"]; 
      obssprite.position=ccp(position,5); 

      [self addChild: obssprite]; 

      [ssprites addObject: obssprite]; 

再後來我想刪除精靈:

for(int i=0; i<[ssprites count];i++) { 
    CCSprite *spr = (CCSprite *) [ssprites objectAtIndex:i]; 
     if(YES) { //this is just for test, the actual program uses an actual condition 

      [spr removeFromParentAndCleanup: YES]; 
      [ssprites removeObjectAtIndex:i]; 
     } 


} 

但由於某些原因,精靈正停留在屏幕上。我應該如何修復代碼才能真正刪除精靈?

+1

'I <[ssprites數]'然後'[ ssprites removeObjectAtIndex:i]'會導致問題。 – Joe

+0

我在代碼中找不到任何錯誤,也許您必須查看代碼的其他部分。 –

回答

0

嘗試:

//.. 
[self removeChild:spr cleanup: YES] 
//.. 
1

喬在他的評論中提及您是通過精靈的數組循環和在循環itsels刪除它們。因此,第一次刪除索引0處的對象,然後將i增加爲1,現在實際上「指向」您原始數組中索引2處的對象(之前位於索引1處的對象現在處於索引0處) 。在我看來,你正在移除每個第二個對象?

不管這個問題,從循環數組中刪除元素永遠不是一個好主意。你需要這個數組嗎?如果你只是簡單地使用了CCNode的children數組(從你的代碼中看來每個精靈都被添加到了父節點和你自己的精靈數組中)。


您可以在行動與這種簡單的代碼裏發現,

NSMutableArray *ssprites = [NSMutableArray arrayWithObjects:@"obj1", @"obj2", @"obj3", @"obj4", @"obj5", nil]; 
for(int i = 0; i < [ssprites count]; i++) 
{ 
    NSString *spr = (NSString *) [ssprites objectAtIndex:i]; 

    NSLog(@"removing %@", spr); 

    [ssprites removeObjectAtIndex:i]; 
} 

我建議你改變這樣的代碼

NSMutableArray *spritesToRemove = [[NSMutableArray alloc] init]; 

for (CCSprite *spr in ssprites) 
{ 
    if (YES) // Your condition goes here 
    { 
     // Remove the sprite from its parent here. 
     [spr removeFromParentAndCleanup:YES]; 
     // However, leave the "spr" in ssprites array - just "mark" it for deletion. 
     [spritesToRemove addObject:spr]; 
    } 
} 

[ssprites removeObjectsInArray:spritesToRemove];