Swift:随机延迟仅适用于第一次?随机数func只执行一次?

时间:2015-07-09 23:51:01

标签: swift random sprite-kit

好吧所以我正在建立一个精灵套件游戏,我需要反复延迟敌人的生成功能

我设法使用此函数生成随机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()仅在第一次运行时也是因为第一次没有打印到控制台。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您应该在SKAction上使用以下静态方法:

class func waitForDuration(_ sec: NSTimeInterval,
                 withRange durationRange: NSTimeInterval) -> SKAction

来自SKAction documentation

  

每次执行操作时,操作都会计算持续时间的新随机值。持续时间可以在任一方向上变化,最多为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)