2015-07-09 64 views
0

好吧,我正在構建一個精靈套件遊戲,我需要延遲敵人spawn func 反覆Swift:隨機延遲只能在第一次使用?隨機數字func只執行一次?

我已經成功地生成使用此功能隨機Double S:

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()僅在第一次運行時也是因爲第一次後沒有任何內容被打印到控制檯。

我該如何解決這個問題?

回答

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

我該如何使用它?你能提供一個在SKAction上使用它的例子嗎? – skyguy

+0

我已更新我的答案:) – ABakerSmith

+0

通過將範圍計算更改爲'let range = abs(max - min)',您可以避免有條件地交換這些值,因此使用常量參數。 – 0x141E