2014-07-11 26 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

歡迎您:) –