SpriteKit - 对多个SKNode上运行的多个SKAction进行排序

时间:2018-02-12 23:28:08

标签: ios swift sprite-kit

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

以下是示例代码(简化):

std::vector<int>* v = new std::vector<int>

前面的代码将完美运行,但是如果我们添加node3,node4将导致样板代码...我希望能够重构它以便更容易阅读和维护给定的规范。类似的东西:

import SpriteKit

class GameScene: SKScene {

    weak var node1: SKNode!
    weak var node2: SKNode!

    override func didMove(to view: SKView) {
        super.didMove(to: view)
        cacheUI()
        runSampleSequence()
    }

    private func cacheUI() {
        // Fetch nodes from associated SKS file
        node1 = self.childNode(withName: "node1")!
        node2 = self.childNode(withName: "node2")!
    }

    private func runSampleSequence() {
        // I want node1 to fadeIn
        // then node2 to fadeIn
        // then node1 to fadeOut
        // then node2 to fadeOut
        node1.run(SKAction.sequence([
            SKAction.fadeIn(withDuration: 1),
            SKaction.run { [weak self] in
                self.node2.run(SKAction.fadeIn(withDuration: 2))
            },
            SKAction.fadeOut(withDuration: 4),
            SKaction.run { [weak self] in
                self.node2.run(SKAction.fadeOut(withDuration: 3))
            }
        ]))
    }
}

我能实现吗?我希望业务代码尽可能清晰。

SKAction.sequence(_ :)在使用SKAction.run {_}时的行为如何,下一步操作是否保证在最后一个SKAction.run块指令执行后运行(如果是本身执行异步调用)?

奖金问题:我是否有权在关闭捕获列表中将自己设置为弱?因为我不想在解雇游戏场景时将其作为强有力的参考。

编辑: 那么,类似的东西可以完成这项工作,但第二次淡化开始于第一次结束之前......

// Does not compile
self.run(SKAction.sequence([
    node1.fadeIn(withDuration: 1),
    node2.fadeIn(withDuration: 2),
    node1.fadeOut(withDuration: 4),
    node2.fadeOut(withDuration: 3)
]))

从SKNode扩展程序返回操作:

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)
    ]))
}

2 个答案:

答案 0 :(得分:0)

  

我能实现吗?我希望业务代码显得清晰   可能的。

您可以使用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运行块内存在异步调用,则下一个SKAction将不会等待该异步调用结束。

  

奖金问题:我在关闭捕获时将自己设置为弱是正确的   清单?因为我不希望它作为一个强有力的参考   解雇游戏场景。

您没有在块中使用self,因此您可以移除[weak self]

答案 1 :(得分:0)

好吧,一个解决方案是将每个SKAction.run {_}部分与具有相同持续时间的SKAction.wait(_ :)组合在一起(这很难看,序列调用应该自己处理它):

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