2014-07-11 24 views
-1

我将一个精灵从一个NSMutableArray复制到另一个NSMutableArray,但是当我从第一个NSMutableArray中删除CCSprite时,它也在第二个数组中被删除。 我该如何预防?在NSMutableArrays之间复制CCSprites

在初始化方法中,数组初始化如下。

spriteTempArray =  [[NSMutableArray alloc] init] ; 
    myPowerUpArray =  [[NSMutableArray alloc] init] ; 

这是第一种方法中的精灵被放置在屏幕上时,德雪碧触摸屏幕上的某处动画

CCSprite *powerUpSprite = [[CCSprite alloc] initWithFile:SpriteFileName ] ; 
powerUpSprite.position = ccp(xcenter,ycenter); 
powerUpSprite.scale = 0; 
[self addChild:powerUpSprite z:20 tag:puTag]; 
[spriteTempArray addObject:powerUpSprite]; 
id zoomIn = [CCScaleTo actionWithDuration:0.2 scale:1] ; 
id moveTo = [CCMoveTo actionWithDuration:0.2 position:ccp(winSize.width/2,120)]; 
[powerUpSprite runAction:zoomIn]; 
[powerUpSprite runAction:moveTo]; 

然后,它移动到屏幕的一角,还存储在另一个NSMutableArray(myPowerUpArray)中。但删除操作将删除两个阵列中的精灵。

CCSprite *powerUpSprite = [spriteTempArray objectAtIndex:0]; 
    id zoomOut = [CCScaleTo actionWithDuration:0.2 scale:0.35] ; 
    id moveTo = [CCMoveTo actionWithDuration:0.2 position:ccp(winSize.width - 24,winSize.height -31 * myPowerUps -80)]; 
    [powerUpSprite runAction:zoomOut]; 
    [powerUpSprite runAction:moveTo] 
    [myPowerUpArray addObject:powerUpSprite]; 
    [self deleteSpriteTempArray]; 

下面的sprite删除方法。

-(void)deleteSpriteTempArray{ 
    NSMutableArray *filesToRemove = [[NSMutableArray alloc] init]; 
    for (id obj in spriteTempArray) { 
     [filesToRemove addObject:obj]; 
     [self removeChild:obj cleanup:YES]; 
    } 
    [spriteTempArray removeObjectsInArray:filesToRemove]; 

}

我还没有观察到的阵列,比德精灵其他被从屏幕上消失。

+2

显示一些代码。 – YvesLeBorg

+0

寻求调试帮助的问题(“为什么这个代码不工作?”)必须包含所需的行为,特定的问题或错误以及在问题本身中重现问题所需的最短代码。特别向我们展示如何分配/初始化阵列以及如何执行复制。 – LearnCocos2D

+0

所以回到你的问题,这是'第一阵列'和'第二阵列'?你如何观察从第二个数组中删除的精灵? – YvesLeBorg

回答

0

您的删除数组方法很奇怪。要开始为什么你打电话:

[self removeChild:obj cleanup:YES]; 

如果你的意图是不从场景中删除精灵?你在这里告诉你的代码将这个精灵从场景中移除并将其清理干净,但是根据你的帖子,我不会得到你真正希望在那一刻发生的印象。如果它的意图是在它移动到屏幕的角落后被移除,那么您应该在CCSpawn中进行移动和缩放(让我们简单地称之为moveScale),然后在CCSequence中添加moveScale动作,然后添加其次

CGSize winSize = [[CCDirector sharedDirector] winSize]; 
CCSprite* powerUp = ...; 

float duration = 0.2f; 
float desiredScale = 1.0f; 
CGPoint desiredPosition = ccp(winSize.width/2,120); 

id zoomIn = [CCScaleTo actionWithDuration:duration scale:desiredScale] ; 
id moveTo = [CCMoveTo actionWithDuration:duration position:desiredPosition]; 

id remove = [CCCallBlock actionWithBlock:^ 
{ 
    [powerUp removeFromParentAndCleanup:YES]; 
}]; 

id moveScale = [CCSpawn actions:zoomIn, moveTo, nil]; 
id moveScaleRemove = [CCSequence actions:moveScale, remove, nil]; 

[powerUp runAction:moveScaleRemove]; 

为什么你有一个“文件删除”数组中的删除方法与对象建立删除:上精灵调用的方法的方块行动本身从其父与清理删除? “文件删除”数组是将所有对象从精灵temp数组添加到它,所以它似乎有点没有意义。只需删除你的精灵temp数组中的所有对象。没有必要建立另一个临时列表,删除所有的东西,仅仅是说从我的原始临时数组列表中删除所有的东西。如果只删除临时数组中的某些对象,这将非常有用。由于要删除所有文件,因此“要删除的文件”数组不起作用。或者至少你的代码显示你在做什么。你是否打算这样做是另一个问题。

此外,如果你有两个数组和两个对象,从一个数组中删除它不会对第二个数组产生影响。

代码的另一个问题是在第一个代码块中。如果您打算一起运行移动和缩放操作,则需要通过CCSpawn执行。相反,你要让它按比例缩放,然后立即告诉它移动,因此它会移动但不会随着移动而缩放。换句话说,两者不是同时发生的。另一方面,如果你打算按顺序完成它们,你应该通过CCSequence执行它们。

我注意到你的代码的另一件事是你为什么只有一个精灵被触摸时删除整个精灵temp数组?你打算只移除那个被触动的精灵吗?为什么不只是删除一个对象,除非我失去了一些东西?

[spriteTempArray removeObject:thisPowerUpIJustTouched]; 

我看到的最后一个问题是你的命名。您的代码示例指示每个示例代码块的顺序是事件发生的顺序?那么为什么您添加通电的初始数组称为spriteTempArray,而在触摸后添加对象的数组称为powerUpArray?根据您提供的代码和显示的顺序,spriteTempArray没有任何意义。即使有,命名也会倒退。除非我错过了一些东西。它看起来像你的意图是有一个电源ups阵列,当一个电源接通时,它被添加到另一个阵列来标记它将被删除。但正如我在本文前面所展示的那样,它看起来并不像第二个数组具有真正的目的,因为你期望的行为是A)没有完成,并且B)将使用我之前展示的CCSpawn/CCSequence组合来完成。

希望这有助于。我刚刚醒来,希望我能妥善解决您的问题。

+0

艾伦S, 谢谢你的所有意见。对此,我真的非常感激。 –

+0

Allen S,我制作了spriteTempArray,因为当它不在数组中时可能因为autorelease而使单个sprite消失。 –

+0

欢迎您:) –