【问题标题】:How to delay next action in sequence until after runBlock completes? (Swift)如何按顺序延迟下一个动作,直到 runBlock 完成后? (迅速)
【发布时间】:2015-03-11 22:43:33
【问题描述】:

moveToduration 属性在 runBlock 内部时不被遵循,从而允许序列中的后续操作在应该只在 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 A 中,itemBmoveAction 完成(大约 2 秒)后被删除。这是正确的顺序。

Code B 中,itemBbadMoveAction 完成之前被删除,这意味着itemB 永远不会从其原始位置移动。就好像Code B 中不支持持续时间属性一样。

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

【问题讨论】:

  • 谢谢,但很遗憾,这不起作用。

标签: ios iphone swift ios8


【解决方案1】:

SKActionrunBlock 创建持续时间为零的动作,并且它会立即发生。所以在Code B会开始执行第一个动作,并立即返回以开始顺序的下一个动作。

如果你想创建自己的动作,你可以使用customActionWithDuration:actionBlock:。否则这里Code A 非常好(如果你只想使用移动动作)。

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

SKAction.runBlock {
itemB.removeFromParent()
}

其他解决方案:

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

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

但这可以使用customActionWithDuration:actionBlock: 来实现。

如果您希望两个动作(移动、删除节点)同时发生,那么您也可以在 SKAction 中使用group

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2016-04-16
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多