随机 运行 两个 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() }
}
}
标题说明了一切。我有两个 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() }
}
}