在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
中,moveAction
在Code B
完成之前被移除,这意味着itemB
永远不会从其原始位置移动。好像badMoveAction
中没有遵守持续时间属性。
我们如何在itemB
中移动Code B
,但确保序列中的下一个操作在itemB
完成之前不会开始?
答案 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
。