2014-07-11 1 views
-1

하나의 NSMutableArray에서 다른 NSMutableArray로 스프라이트를 복사하려고하는데 첫 번째 NSMutableArray에서 CCSprite를 삭제하면 두 번째 Array에서도 삭제됩니다. 어떻게 방지 할 수 있습니까?copy NSMutableArrays 사이의 CCSprites

init 메서드에서 배열은 아래와 같이 초기화됩니다.

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)에 있습니다. 그러나 delete 액션은 두 배열에서 스프라이트를 지 웁니다.

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

}

나는 화면에서 사라지고 드 스프라이트 이외의 배열을 관찰하지 않았습니다.

+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 배열의 일부 객체 만 제거하는 경우에만 유용합니다. 모두 제거하기 때문에 "제거 할 파일"배열은 목적을 달성하지 못합니다. 아니면 적어도 당신의 코드가 보여주는 것입니다. 당신이 그 행동을 의도 하느냐는 또 다른 질문입니다.

두 배열과 두 개체가 모두 하나의 배열에서 제거되면 두 번째 배열에도 영향을주지 않습니다.

코드의 다른 문제는 첫 번째 코드 블록에 있습니다. 이동 및 축척 작업을 함께 실행하려면 CCSpawn을 통해 실행해야합니다. 대신에 크기를 조정하라는 말을하고 나서 즉시 움직 이도록 지시하고 있으므로 움직일 때 크기 조정을하지 않습니다. 다른 말로하면 두 가지가 동시에 발생하지 않습니다. 다른 한편으로는 순서대로 수행하려는 경우 CCSequence를 통해 실행해야합니다.

내가 코드에 대해 알아 차린 또 다른 사실은 스프라이트 하나만 만졌을 때 전체 스프라이트 임시 배열을 삭제하는 이유는 무엇입니까? 만진 그 하나의 스프 라이트 만 제거하려고 했습니까?내가 물건을 놓치지 않는 한 그 물건 하나만 꺼내는 게 어떨까요?

[spriteTempArray removeObject:thisPowerUpIJustTouched]; 

최종 문제는 귀하의 이름입니다. 코드 예제는 각 예제 코드 블록의 순서가 이벤트가 올바르게 발생하는 순서임을 나타냅니다. 그렇다면 초기 배열에 spriteTempArray라는 파워 업을 추가하는 이유는 터치 한 객체를 추가 한 배열을 powerUpArray라고하는 이유는 무엇입니까? 제공 한 코드와 표시된 순서에 따라 spriteTempArray에는 아무런 의미가 없습니다. 그리고 그것이 있었다고하더라도, 명명은 거꾸로 보입니다. 물론 나는 뭔가를 놓치지 않는 한. 귀하의 의도는 파워 업 배열을 가지고있는 것처럼 보이며 전원을 켤 때 다른 어레이에 추가되어 삭제 될 것으로 표시됩니다. 그러나이 글의 앞부분에서 보았 듯이 원하는 동작이 A) 수행되지 않고 B) 이전에 보여 줬던 CCSpawn/CCSequence 콤보를 사용하여 완료되기 때문에 두 번째 배열에는 진정한 목적이있는 것처럼 보이지 않습니다.

희망이 도움이되었습니다. 방금 일어 났으므로 잘하면 문제를 적절하게 해결했습니다.

+0

Allen S, 의견을 보내 주셔서 감사합니다. 정말 감사. –

+0

Allen S, 필자는 spriteTempArray를 만들었습니다. 왜냐하면 배열에 없을 때 단일 스프라이트가 사라 졌기 때문입니다. 아마도 autorelease 때문일 것입니다. –

+0

당신은 환영합니다 :) –