2014-01-16 52 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,這可能導致節點不能在稍後解除分配,因爲序列永遠運行,因此持有強自引用,直到節點解除分配 - 我不能說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具有相同的值會工作。如果它不嘗試使用0作爲from參數,甚至可能將duration增加到某個像0.01這樣的低值。

+0

非常感謝您的回覆。不幸的是,你的建議產生相同的結果我有一種感覺,在cocos2d框架內可能會有某些東西在改變zOrder的動作。 – Aelin

+0

您是否嘗試過手動設置zOrder?如果有問題的節點具有不同的父節點,則實際上必須更改父節點的zOrder,因爲zOrder僅影響兄弟節點(層次結構中同一級別的節點)的繪製順序。 – LearnCocos2D

+0

我試着用相同的結果手動設置它。所有的精靈都是精靈的批處理節點,所以我認爲這可能是問題的一部分,但我已經讀過他們維護一個內部zorder。也許他們在行動中不能輕易改變。解釋發生的奇怪的錯誤:我創建了一個法術力對象的實例,然後與晶體對象碰撞(ccsprite的兩個子類並添加到spritebatch),它在循環中運行這些動作。當第一個法術物體產生時,它會在水晶前面並留在前面。 – Aelin