如何延迟下一个动作,直到runBlock完成后? (迅速)
在runBlock
内部不会遵循moveTo
的duration
属性,从而允许序列中的后续操作在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
, itemB
在moveAction
完成后被移除(大约2秒)。 这是正确的顺序。
在Code B
, itemB
在badMoveAction
完成之前被移除,这意味着itemB
永远不会从原始位置移开。 这就好像Code B
的持续时间属性不受尊重。
我们如何在Code B
移动itemB
,但是确保序列中的下一个动作直到badMoveAction
完成才会启动?
runBlock
的SKAction
创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
。
- 为什么我的iOS应用程序不能在我的iPod touch上运行?
- 在iPhone上的Sqlite“近”语法错误
- Sencha在iPhone模拟器中parsingJSON,但不支持iPhone – phonegap
- 在iOS中从URL加载UIImage
- Xcode 6.0.1命令/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc失败,退出代码1
- iOS应用程序的企业分布
- 更改UIActionSheet标题string的字体types和大小
- 如何在AS3中使用iOS相机?
- UIBezierPath从图像