从NSMutableArray中删除烈酒

时间:2013-04-18 14:47:43

标签: objective-c arrays cocos2d-iphone

我正在开发一个cocos2d项目,并希望使用一系列sprite。

我创建了数组:

NSMutableArray *ssprites;

然后我在init方法中添加了东西:

CCSprite *obssprite = [CCSprite spriteWithFile:@"/Users/Desktop/Programs/physics test/physics test/Resources/Icon-Small@2x.png"];  
            obssprite.position=ccp(position,5);

            [self addChild: obssprite];

            [ssprites addObject: obssprite];

后来我想删除sprite:

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];
        }


}

但出于某种原因,精灵们仍留在屏幕上。我该如何修复代码以实际删除精灵?

2 个答案:

答案 0 :(得分:1)

正如乔在他的评论中提到的那样,你正在循环遍历精灵数组,并在循环中删除它们。因此,第一次删除索引0处的对象,然后将i增加到1,现在实际上“指向”原始数组中索引2处的对象(之前的索引为1的对象)在索引0)。在我看来,你正在删除每一个对象?

无论这个问题如何,从您循环的数组中删除元素绝不是一个好主意。你需要这个阵列吗?如果您只是使用CCNode的子数组(从您的代码中看起来每个精灵都添加到父级和您自己的精灵数组中)该怎么办。


您可以使用此简单代码

查看此操作
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];

答案 1 :(得分:0)

尝试:

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