随机 运行 两个 SKActions 同时用于两个单独的 SKSpriteNodes

Randomly run two SKActions at same time for two separate SKSpriteNodes

标题说明了一切。我有两个 SKSpriteNodes [leftTrap, rightTrap] 和两个单独的 SKActions [rotateSequenceLeft, rotateSequence] 需要同时 运行 但需要随机进行。

带有附加 SKActions 的 SKSpriteNodes

需要运行这两个以相同的随机间隔并行。

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

我试过的

我尝试将 leftTrap 节点和动作 rotateSequenceLeft 与等待持续时间范围动作组合在一起。但似乎创建的组甚至从未 运行s 等待时间操作。

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

你可以试试这样的

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?.rotate on the left trap passing a random bool for the clockwise param 然后做同样的事情寻找正确的陷阱。

然后 rotateTraps 动作被包装成一个序列并每 5 秒永远重复一次。

如果两个鳍状肢需要始终同步,只需将动作应用于左侧鳍状肢,然后对右侧鳍状肢执行此操作:

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

这将确保两个脚蹼始终处于相反的角度

如果出于某种原因您不想像 Knight0fDragon 的回答那样添加 post-评估阶段,那么您可以这样做:

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