好吧所以我正在建立一个精灵套件游戏,我需要反复延迟敌人的生成功能 。
我设法使用此函数生成随机Double
:
func randomDelay()->Double {
var randLower : UInt32 = 1
var randUpper : UInt32 = 50
var randDelayTime = arc4random_uniform(randUpper - randLower) + randLower
var randDelayTimer = Double(randDelayTime) / 10
//var randDelay = randDelayTimer * Double(NSEC_PER_SEC)
//var newTime = dispatch_time(DISPATCH_TIME_NOW, Int64(randDelay))
println(randDelayTimer)
return randDelayTimer
}
我知道这很有效,因为我多次打印randDelayTimer
,实际上它确实产生了随机Double
。
这是我在反复随机延迟后尝试产生敌人的地方:
runAction(SKAction.repeatActionForever(
SKAction.sequence([
SKAction.waitForDuration(NSTimeInterval(randomDelay())),
SKAction.runBlock({self.spawnEnemy1()})))
这样可行,但只在第一次运行时才有效。无论Double
生成随机randomDelay()
,序列循环的第一时间都会应用于之后生成的每个敌人。例如,如果游戏运行时randomDelay()
= 3.5,则会永久重复3.5秒的延迟。
我知道randomDelay()
仅在第一次运行时也是因为第一次没有打印到控制台。
我该如何解决这个问题?
答案 0 :(得分:2)
您应该在SKAction
上使用以下静态方法:
class func waitForDuration(_ sec: NSTimeInterval,
withRange durationRange: NSTimeInterval) -> SKAction
每次执行操作时,操作都会计算持续时间的新随机值。持续时间可以在任一方向上变化,最多为durationRange参数值的一半。
在您的情况下,最短持续时间为1秒,最长持续时间为50秒,您可以使用:
// A mean wait of 25.5 seconds. The wait can vary by 24.5 seconds above and below the mean.
let waitAction = SKAction.waitForDuration(25.5, withRange: 49)
从最长和最短等待时间手动计算平均值和范围有点不方便,因此您可以使用SKAction
上的扩展程序为您完成工作:
extension SKAction {
static func waitForDuration(minimum min: NSTimeInterval, maximum max: NSTimeInterval) -> SKAction {
return SKAction.waitForDuration((max + min) / 2, withRange: abs(max - min))
}
}
用法:
let waitAction = SKAction.waitForDuration(minimum: 1, maximum: 50)