我的敵人類有幾種方法,例如walkAnimation
和deathAnimation
,它們返回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]
。雖然這並不理想。是否有可能在運行循環的不同迭代中完成waitForDuration
和flashRed
動作?這對於這種情況並不重要,但只要涉及多個完成處理程序的多個操作,我就擔心競爭情況可能會導致。
除waitForDuration:
以外,我還有其他選擇嗎?
直接在'Sprite'節點上運行'flashRed'會更好嗎?那會有一段時間。 –