Как запустить действия по сбору спрайтов? - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь выполнить некоторые действия с массивом спрайтов, и мне нужно запустить эти действия последовательно для спрайтов, проблема в том, что когда я использую для цикла, он применяет действие сразу, и между ними нет промежутка времени .

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

При вызове этой функции она должна исчезнуть в цвет массива boyColors с некоторым промежутком времени между ними, но он исчезает во всех цветах, съеденных один раз

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Если вы хотите, чтобы все 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.

0 голосов
/ 07 мая 2019

Для вас доступно множество SKActions, включая пробежку с завершением, которую вы можете использовать.Одним из возможных подходов может быть -

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?()

Это приведет к исчезновению объектов один за другим.Я думаю, что код будет работать, но это что-то вроде того, что я не смог протестировать.

...