在NSMutableArrays之间复制CCSprites

时间:2014-07-11 11:44:53

标签: ios cocos2d-iphone nsmutablearray

我正在将一个精灵从一个NSMutableArray复制到另一个,但是当我从第一个NSMutableArray中删除CCSprite时,它也会在第二个数组中被删除。 我该如何防止这种情况?

在init方法中,Arrays初始化如下。

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

然后当触摸de Sprite时,它会移动到屏幕的一角,并存储在另一个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];

精灵删除方法下面。

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

}

我没有观察到阵列,除了de sprite正在从屏幕上消失。

1 个答案:

答案 0 :(得分:0)

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

[self removeChild:obj cleanup:YES];

如果您不打算从场景中删除精灵?你在这里告诉你的代码从场景中删除精灵并清理它,但根据你的帖子,我没有得到你真正希望那一刻发生的印象。如果你的目的是在它移动到屏幕的一角后被删除,那么你应该在CCSpawn中进行移动和缩放(让我们简单地称之为moveScale),在CCSequence中你应该添加moveScale动作,然后一个块动作,它调用sprite上的一个方法,通过cleanup从其父节点中删除它自己:

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

其次,为什么在删除方法中有一个“要删除的文件”数组,该数组是使用要删除的对象构建的? “要删除的文件”数组是将精灵临时数组中的所有对象添加到它,所以它似乎有点无意义。只需删除精灵临时数组中的所有对象。无需构建另一个临时列表,其中包含要移除的所有内容,只是为了从我原来的临时数组列表中删除所有内容。只有在仅删除临时数组中的某些对象时,这才有用。由于您要删除所有内容,因此“要删除的文件”数组不起作用。或者至少这是您的代码显示您正在做的事情。你是否打算采取这种行为是另一个问题。

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

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

我注意到你的代码的另一件事是你为什么在只触摸一个精灵时删除整个精灵临时数组?你打算只删除被触摸的那个精灵吗?为什么不删除那个对象,除非我遗漏了什么?

[spriteTempArray removeObject:thisPowerUpIJustTouched];

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

希望这有帮助。我刚刚醒来,所以希望我能正确解决你的问题。