2014-01-16 4 views
1

CCSequence에서 CCSprite의 ZOrder를 변경하는 방법을 알고 싶습니다. 다른 스레드에서 제안한대로 CCCallBlock을 사용하여 시도했지만 괴롭힘을 당했고 동일한 클래스의 다른 스프라이트를 중지합니다. 누군가가 제안 할 수있는 또 다른 방법이 있습니까?CCSequence에서 ZOrder를 변경하는 방법은 무엇입니까?

crystalEntryPoint = [self position]; 
float xD = [crystal position].x - crystalEntryPoint.x; 
float yD = [crystal position].y - crystalEntryPoint.y; 
CGPoint dest = ccp(crystalEntryPoint.x + (xD * 2),crystalEntryPoint.y + (yD * 2)); 
float easingRate = 2; 

CCMoveTo *moveTo = [CCMoveTo actionWithDuration:1 position:dest]; 
CCMoveTo *moveBack = [CCMoveTo actionWithDuration:1 position:crystalEntryPoint]; 
CCEaseInOut *easeTo = [CCEaseInOut actionWithAction:moveTo rate:easingRate]; 
CCEaseInOut *easeBack = [CCEaseInOut actionWithAction:moveBack rate:easingRate]; 
CCCallBlock *zOrderBehind = [CCCallBlock actionWithBlock:^{ [self setZOrder:kManaSpriteBehindCrystalZValue]; }]; 
CCCallBlock *zOrderInFront = [CCCallBlock actionWithBlock:^{ [self setZOrder:kManaSpriteZValue]; }]; 

CCSequence *seq = [CCSequence actions:easeTo,zOrderBehind,easeBack,zOrderInFront,nil]; //,zOrderInfront 
CCRepeatForever *rep = [CCRepeatForever actionWithAction:seq]; 

[self runAction:rep]; 

답변

0

시도를 매개 변수로 실행하는 노드 블록을 제공하는 CCCallBlockN을 시도하십시오. 현재 설정은 블록 안에 self을 유지하므로 노드가 dealloc하지 않게 될 수 있습니다. 왜냐하면 시퀀스가 ​​영원히 계속 실행되기 때문에 노드가 할당 해제 될 때까지 강력한 자체 참조가 유지되기 때문입니다. cocos2d가 올바르게 정리할 수 있는지 말할 수 없습니다. , 그렇지 않아야합니다.

이 문제가 귀하의 문제와 관련이 있는지는 모르겠지만 코드 스 니펫의 모든 내용이 문제가없는 것으로 판단되는 것으로 보입니다. 그래도 문제가 해결되지 않으면

CCCallBlockN *zOrderBehind = [CCCallBlockN actionWithBlock:^(CCNode* node){ 
    [node setZOrder:kManaSpriteBehindCrystalZValue]; 
}]; 
CCCallBlockN *zOrderInFront = [CCCallBlockN actionWithBlock:^(CCNode* node){ 
    [node setZOrder:kManaSpriteZValue]; 
}]; 

중 하나를 다음 이름으로 어떤 속성을 변경 허용 CCActionTween을 시도합니다.

id zOrderChange = [CCActionTween actionWithDuration:0.0 
               key:"zOrder" 
               from:kManaSpriteZValue 
               to:kManaSpriteZValue]; 

나는 from/to가 같은 값이 작동 가지고 있는지 확실하지 않습니다. from 매개 변수로 0을 사용하려고 시도하지 않고 duration을 0.01과 같이 약간 낮은 값으로 늘려보십시오.

+0

답변 해 주셔서 감사합니다. 불행히도 귀하의 제안은 동일한 결과를 산출합니다. 액션에서 zOrder를 변경하기 위해 cocos2d 프레임 워크에서 무언가가 깨질 수 있습니다. – Aelin

+0

zOrder를 수동으로 설정해 보셨습니까? 문제가되는 노드의 부모가 다른 경우 zOrder는 형제 노드 (계층 구조의 동일한 수준에있는 노드)의 그리기 순서에만 영향을 미치기 때문에 실제로 부모 노드의 zOrder를 변경해야합니다. – LearnCocos2D

+0

동일한 결과를 수동으로 설정하려고했습니다. 모든 스프라이트는 스프라이트 배치 노드를 부모로 사용하므로 문제의 일부가 될 수 있다고 생각하지만 내부 zorder를 유지한다는 내용을 읽었습니다. 어쩌면 그들은 행동으로 쉽게 변경 될 수 없습니다. Wierd 버그에 대한 설명 : 나는 마나 오브젝트의 인스턴스를 생성 한 다음 크리스탈 오브젝트 (ccsprite의 서브 클래스와 spritebatch에 추가 된)와 함께 collion에 작업을 실행하여 루프에서 액션을 실행합니다. 첫 번째 마나 물체가 생성되면 크리스탈 앞에서 머물러있게됩니다. – Aelin

관련 문제