Произвольно запустить два SKActions одновременно для двух отдельных узлов SKSpriteNode - PullRequest
0 голосов
/ 07 января 2020

Название говорит само за себя. У меня есть два узла SKSpriteNode [leftTrap, rightTrap] с двумя отдельными SKActions [rotateSequenceLeft, rotateSequence], которые должны выполняться одновременно, но должны выполняться случайным образом.

Узлы SKSprite с подключенными SKActions

Необходимо запустить эти два параллельно с одинаковыми случайными интервалами.

   leftTrap.run(SKAction.repeatForever(rotateSequenceLeft))
   rightTrap.run(SKAction.repeatForever(rotateSequence))

Что я пробовал

Я попытался сгруппировать узел leftTrap и действие rotateSequenceLeft с действием диапазона продолжительности ожидания. Но создается впечатление, что созданная группа даже не запускает действие продолжительности ожидания.

        let randomPivotInterval = SKAction.wait(forDuration: 1.0, withRange: 5.0)


        let leftGroup = SKAction.group([rotateSequenceLeft, randomPivotInterval])

        let rightGroup = SKAction.group([rotateSequence, randomPivotInterval])



   leftTrap.run(SKAction.repeatForever(leftGroup))
   rightTrap.run(SKAction.repeatForever(rightGroup))

Ответы [ 3 ]

0 голосов
/ 07 января 2020

Если оба флиппера должны быть синхронизированы c, просто примените действие к левому флипперу и сделайте это для правого:

func didEvaluateActions(){
    rightTrap.angle = -leftTrap.angle
}

Это гарантирует, что оба флиппера будут всегда под противоположным углом

0 голосов
/ 07 января 2020

Если по какой-либо причине вы не хотите добавлять этап пост-оценки, как в ответе Knight0fDragon, то вы, вероятно, можете сделать что-то вроде этого:

func operateTrap() {
  run(.wait(forDuration: .random(in: 1.0 ... 6.0)) { // On completion...
    // I assume both sequences take the same time.
    leftTrap.run(rotateSequenceLeft)
    rightTrap.run(rotateSequenceRight) { self.operateTrap() }
  }
}
0 голосов
/ 07 января 2020

Вы можете попробовать что-то вроде этого

class GameScene: SKScene {

    var leftTrap: SKSpriteNode! // TODO: populate this
    var rightTrap: SKSpriteNode! // TODO: populate this

    func start() {
        let rotateTraps = SKAction.run { [weak self] in
            guard let self = self else { return }
            self.rotate(trap: self.leftTrap, clockwise: .random())
            self.rotate(trap: self.rightTrap, clockwise: .random())
        }

        let wait = SKAction.wait(forDuration: 5)
        let sequence = SKAction.sequence([rotateTraps, wait])
        run(.repeatForever(sequence))

    }

    private func rotate(trap: SKSpriteNode, clockwise: Bool) {
        // TODO: put rotation code here
    }

}

Как это работает?

Метод start() создает действие rotateTraps, которое при каждом выполнении вызывает self ? .Вращайте левую ловушку, передавая случайное логическое значение для параметра по часовой стрелке, а затем делайте то же самое для правой ловушки.

Затем действие rotateTraps переносится в последовательность и повторяется навсегда каждые 5 секунд.

...