Ios SpriteKit-对在多个SKNode上运行的多个SKActions进行排序
我非常了解SKAction API,但在多个节点上运行顺序代码时,我无法获得好的代码 下面是一个示例代码(简化): 前面的代码运行得很好,但是如果我们添加node3、node4。。。我希望能够重构它,以便更容易阅读和维护给定的规范。比如:Ios SpriteKit-对在多个SKNode上运行的多个SKActions进行排序,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我非常了解SKAction API,但在多个节点上运行顺序代码时,我无法获得好的代码 下面是一个示例代码(简化): 前面的代码运行得很好,但是如果我们添加node3、node4。。。我希望能够重构它,以便更容易阅读和维护给定的规范。比如: // Does not compile self.run(SKAction.sequence([ node1.fadeIn(withDuration: 1), node2.fadeIn(withDuration: 2), node1.f
// Does not compile
self.run(SKAction.sequence([
node1.fadeIn(withDuration: 1),
node2.fadeIn(withDuration: 2),
node1.fadeOut(withDuration: 4),
node2.fadeOut(withDuration: 3)
]))
我能做到这一点吗?我希望业务代码尽可能清晰
当使用SKAction.run{{{}时,SKAction.sequence(:)的行为如何?下一个操作是否保证在最后一个SKAction.run块的指令执行后运行(如果它本身执行异步调用呢)
附加问题:我在闭包捕获列表中将self设置为弱是否正确?因为我不希望在忽略游戏场景时将其作为一个有力的参考
编辑:
嗯,像这样的东西可以做的工作,但第二次褪色开始之前,第一个结束
private func runSampleSequence() {
// I want node1 to fadeIn
// then node2 to fadeIn
// then node1 to fadeOut
// then node2 to fadeOut
self.run(SKAction.sequence([
node1.fadeIn(withDuration: 1),
node2.fadeIn(withDuration: 2),
node1.fadeOut(withDuration: 4),
node2.fadeOut(withDuration: 3)
]))
}
通过从SKNode扩展返回操作:
extension SKNode {
func fadeIn(withDuration: TimeInterval) -> SKAction {
let action = SKAction.run {
self.run(SKAction.fadeIn(withDuration: withDuration))
}
return action
}
//TODO: Extend for each base SKAction ...
}
我能做到这一点吗?我希望业务代码尽可能清晰
可能
您可以使用swift扩展来提高代码的可读性。例如:
extension SKNode {
//TODO: Rename method and variable to be more expressive
func runAnimationName(node2:SKNode) {
self.run(SKAction.sequence([
SKAction.fadeIn(withDuration: 1),
SKAction.run {
node2.run(SKAction.fadeIn(withDuration: 2))
},
SKAction.fadeOut(withDuration: 4),
SKAction.run {
node2.run(SKAction.fadeOut(withDuration: 3))
}
]))
}
}
使用SKAction.run时,SKAction.sequence(:)的行为究竟如何
{{},下一个操作是否保证在最后一个操作之后运行
执行SKAction.run块的指令(如果它本身
执行异步调用吗
是的,操作是按顺序执行的。另外,如果SKAction
run块中存在异步调用,则下一个SKAction
将不会等待该异步调用结束
附加问题:我在截图捕捉中把自己设置为弱者对吗
名单?因为我不希望它被保留为一个强大的参考时
忽略游戏场景
您没有在块内使用
self
,因此可以删除[弱self]
好吧,一个解决方案是将每个SKAction.run{}节与SKAction.wait(:])分组,并使用相同的持续时间(这很难看,序列调用应该自己处理):
谢谢,但是扩展只是隐藏了内部动画实现,仍然是一样的。我不能用我提供的第二个代码片段来编写它。我在块中使用self,因为node2隐式地引用self.node2(我编辑代码添加它)。
extension SKNode {
//TODO: Rename method and variable to be more expressive
func runAnimationName(node2:SKNode) {
self.run(SKAction.sequence([
SKAction.fadeIn(withDuration: 1),
SKAction.run {
node2.run(SKAction.fadeIn(withDuration: 2))
},
SKAction.fadeOut(withDuration: 4),
SKAction.run {
node2.run(SKAction.fadeOut(withDuration: 3))
}
]))
}
}
extension SKNode {
func fadeIn(withDuration: TimeInterval) -> SKAction {
let action = SKAction.group([
SKAction.wait(forDuration: withDuration),
SKAction.run {
self.run(SKAction.fadeIn(withDuration: withDuration))
}
])
return action
}
//TODO: Extend for each base SKAction ...
}