Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SpriteKit-对在多个SKNode上运行的多个SKActions进行排序_Ios_Swift_Sprite Kit - Fatal编程技术网

Ios SpriteKit-对在多个SKNode上运行的多个SKActions进行排序

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

我非常了解SKAction API,但在多个节点上运行顺序代码时,我无法获得好的代码

下面是一个示例代码(简化):

前面的代码运行得很好,但是如果我们添加node3、node4。。。我希望能够重构它,以便更容易阅读和维护给定的规范。比如:

// 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 ...
}