我正在开发一个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];
}
}
但出于某种原因,精灵们仍留在屏幕上。我该如何修复代码以实际删除精灵?
答案 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]
//..