2014-01-10 29 views
1

我的敵人類有幾種方法,例如walkAnimationdeathAnimation,它們返回SKAction的實例。因爲這些SKActions涉及協調敵人節點的許多子節點上的基本操作,所以runAction:onChildWithName:似乎是管理這一點的方式。如何與SKAction -runAction同步:onChildWithName:?

但是,根據文檔(和試驗),SKAction -runAction:onChildWithName:是即時的。這意味着如果這樣的動作出現在一個序列中,下一個動作將立即觸發,而不是等待該子動作完成。同樣,如果有一個完成處理程序,它將立即被調用。如此有效,runAction:onChildWithName:無非是一個runBlock:動作的快捷方式,就像removeFromParent一樣。

作爲我面臨的問題的一個具體例子,說我有一個複合死亡動畫。支持我的敵人的雪碧閃爍紅色,然後敵人本身從場景中移除。我不能直接在敵人身上使用colorizeWithColor:colorBlendFactor:duration:,因爲該動作只能在SKSpriteNode實例上運行。我不能在Enemy's Sprite節點上使用removeFromParent,因爲這不會將這個敵人實例從場景中完全移除。所以需要runAction:onChildWithName:

-(SKAction *)deathAnimation { 
    SKAction *flashRed = [SKAction colorizeWithColor:[UIColor redColor] colorBlendFactor:1.0 duration:0.2]; 
    return [SKAction sequence:@[ 
           [SKAction runAction:flashRed onChildWithName:@"Sprite"], 
           [SKAction removeFromParent], 
           ]]; 
} 

當我運行這個SKAction時,我的敵人節點立即消失而不閃爍紅色。原因是runAction:onChildWithName:確實不是有一個持續時間0.2。其持續時間是即時的。同樣,如果我的SKScene使用[enemy runAction:[enemy deathAnimation] completion:^{ ... }];,那麼將立即調用該完成塊。

我不願意切換到較小的設計。我的敵人級別返回SKAction個實例,以使SKScene精確控制這些動作的協調和組合。對此的一個重要方面是通知完成這些行動。 runAction:onChildWithName:肯定不符合該標準。

一個解決方法是在runAction:onChildWithName:removeFromParent之間的序列中包含[SKAction waitForDuration:0.2]。雖然這並不理想。是否有可能在運行循環的不同迭代中完成waitForDurationflashRed動作?這對於這種情況並不重要,但只要涉及多個完成處理程序的多個操作,我就擔心競爭情況可能會導致。

waitForDuration:以外,我還有其他選擇嗎?

+0

直接在'Sprite'節點上運行'flashRed'會更好嗎?那會有一段時間。 –

回答

0

你在這裏使用的順序錯了,它實際上阻礙了它。

獲取名爲Sprite的子節點。通過使用removeFromParent方法而不是具有相同名稱的操作來移除精靈(或精靈的父級),並使用完成處理程序對其執行閃回紅色操作。

+0

您能否詳細說明我如何使用序列錯誤?它需要一個SKA列表和runAction:onChildWithName:是一個SKAction。另外,正如我在問題中提到的,我希望SKScene負責將行動付諸行動。不是每個節點的子類。 – sartak

+0

錯誤,因爲「你不需要使用它進行兩個即時操作」。無論有沒有序列,這兩個動作都會有相同的(不希望的)效果。從設計的角度來看,我不會讓場景管理所有的動作,而是讓消息發送給單個節點,他們應該執行某個任務,並讓他們選擇適當的動作。從長遠來看,這種方法效果更好,因爲它使得單個節點對自己的行爲負責。 – LearnCocos2D