0

我正在做一个 cocos2d 项目,并希望使用一组精灵。

我创建数组:

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

然后稍后我想删除精灵:

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


}

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

4

2 回答 2

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];
于 2013-04-18T18:24:55.407 回答
0

尝试:

//..
[self removeChild:spr cleanup: YES]
//..
于 2013-04-18T14:54:04.090 回答