如何在runBlock完成之前按顺序延迟下一个动作? (迅速)

时间:2015-03-11 22:43:34

标签: ios iphone swift ios8

duration内部时,moveTo的{​​{1}}属性未被跟踪,允许序列中的后续操作立即执行,只应在{{1}之后执行秒。

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

runBlock

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

duration

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() }])) 中,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 A被删除(约2秒)。这是正确的顺序。

itemB中,moveActionCode B完成之前被移除,这意味着itemB永远不会从其原始位置移动。好像badMoveAction中没有遵守持续时间属性。

我们如何在itemB中移动Code B,但确保序列中的下一个操作在itemB完成之前不会开始?

1 个答案:

答案 0 :(得分:0)

SKAction的{​​{3}}创建了零持续时间的动作,并且它立即发生。因此,在Code B中,它将开始执行第一个操作并立即返回以按顺序启动下一个操作。

如果您想要创建自己的持续时间操作,可以使用runBlock。否则,此处Code A完全正常(如果您只想使用移动操作)。

此外,您可以使用customActionWithDuration:actionBlock:删除itemB,而不是:

SKAction.runBlock {
itemB.removeFromParent()
}

其他解决方案:

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

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

但这可以使用SKAction.removeFromParent()来实现。

如果你想同时进行两个动作(移动,删除节点),那么你也可以在SKAction中使用group