如何延迟下一个动作,直到runBlock完成后? (迅速)

runBlock内部不会遵循moveToduration属性,从而允许序列中的后续操作在duration秒后才能被执行。

代码A(顺序执行正确):

 let realDest = CGPointMake(itemA.position.x, itemA.position.y) let moveAction = SKAction.moveTo(realDest, duration: 2.0) itemB.runAction(SKAction.sequence([SKAction.waitForDuration(0.5), moveAction, SKAction.runBlock { itemB.removeFromParent() }])) 

代码B(序列没有正确执行):

 let badMoveAction = SKAction.runBlock { let realDest = CGPointMake(itemA.position.x, itemA.position.y) let moveAction = SKAction.moveTo(realDest, duration: 2.0) itemB.runAction(moveAction) } itemB.runAction(SKAction.sequence([SKAction.waitForDuration(0.5), badMoveAction, SKAction.runBlock { itemB.removeFromParent() }])) 

Code AitemBmoveAction完成后被移除(大约2秒)。 这是正确的顺序。

Code BitemBbadMoveAction完成之前被移除,这意味着itemB永远不会从原始位置移开。 这就好像Code B的持续时间属性不受尊重。

我们如何在Code B移动itemB ,但是确保序列中的下一个动作直到badMoveAction完成才会启动?

runBlockSKAction创build持续时间为零的动作,它瞬间发生。 因此,在Code B ,它将开始执行第一个动作,并立即返回以开始下一个动作。

如果你想用持续时间创build你自己的动作,你可以使用customActionWithDuration:actionBlock: 否则,这里Code A是完全正确的(如果你只想使用移动动作)。

您也可以使用SKAction.removeFromParent()来删除itemB而不是:

 SKAction.runBlock { itemB.removeFromParent() } 

其他解决scheme

runBlock立即执行时,您可以在删除节点之前添加waitForDuration操作(在runBlock之后添加持续时间等于runBlock的操作)

 itemB.runAction(SKAction.sequence([SKAction.waitForDuration(0.5), badMoveAction, SKAction.waitForDuration(2.0), SKAction.removeFromParent()])) 

但是这可以通过使用customActionWithDuration:actionBlock:来实现customActionWithDuration:actionBlock:

如果你想同时发生两个动作(move,remove node),那么你也可以在SKAction中使用group