如何对精灵集合进行操作?

时间:2019-05-07 13:45:51

标签: swift sprite-kit

我尝试在子画面数组上运行一些动作,并且需要为子画面依次运行此动作,问题是当我使用for循环时,它立即应用该动作,并且它们之间没有时间间隔

func setColors() {
    for color in boyColors {
        color.run(.wait(forDuration: 0.3))
        color.run(.fadeIn(withDuration: 0.5))
    }
}

调用此函数时,它应淡入颜色 的boyColors数组之间有一定的时间间隔,但是它在所有颜色中的消失一次就吃掉了

2 个答案:

答案 0 :(得分:1)

如果您希望所有4个在延迟后同时消失:

func setColors() {
   let seq = [SKAction.wait(forDuration: 0.3),SKAction.fadeIn(withDuration: 0.5)]
    for color in boyColors {

        color.run(SKAction.sequence(seq))
    }
}

如果您需要它们逐渐淡入淡出:

func setColors() {
    var seq = [SKAction]()
    let wait3 = SKAction.wait(forDuration: 0.3)
    let wait5 = SKAction.wait(forDuration: 0.5)
    let fadeIn = SKAction.fadeIn(withDuration: 0.5)

    for color in boyColors {
        let colorFadeIn = SKAction.run({color?.run(fadeIn)})
        let group = [wait5,colorFadeIn]
        seq.append(wait3)
        seq.append(SKAction.group(group))
    }
    scene.run(SKAction.sequence(seq))
}

这是为了允许场景(或要触发动作的任何节点)控制淡入淡出事件的开始时间。这假定所有节点都以相同的速度运行。如果您需要节点以单独的速度运行,则需要更复杂的东西,例如SomaMen建议将下一个颜色动作链接到当前颜色的末尾。您还必须检查这方面的颜色是否存在,因为如果您使用RGBY之类的链,并且删除了G,则唯一会发射的颜色是R。

答案 1 :(得分:0)

您可以使用各种SKAction,包括带有完成功能的运行。一种可能的方法是-

var colors = boyColors // so we can remove each item as we've faded it in
var waitAndFadeIn: (() -> ())?

waitAndFadeIn = {
    guard let boyColor = colors.first else { return } // stops when we run out of items

    let wait: SKAction = .wait(forDuration: 0.3)
    let fadeIn: SKAction = .fadeIn(withDuration: 0.5)

    let sequence: SKAction = .sequence([wait, fadeIn])

    boyColor.run(sequence, completion: {
        colors.remove(at: 0)
        waitAndFadeIn?() // do it again with the next boyColor 
    })
}

waitAndFadeIn?()

这会在对象中逐渐消失。我认为代码可以运行,但这是我无法测试的东西。