2016-12-20 22 views
0

私は、タイムインターバルを変更しようとすると、「周波数」と呼ばれる時間間隔変数に特定の機能(以下に示す)を実行するようにセットアップされています。得点数に基づいて、小さい数に可変周波数は、それだけで周波数が低く数速いスプライトキットでタイマーの時間間隔を変更する

override func didMove(to view: SKView) { 

    Timer.scheduledTimer(timeInterval: frequency, target: self, selector: #selector(GameScene.spawnFallingOjects), userInfo: nil, repeats: true) 

} 


func spawnFallingOjects() { 

    if (GameState.current == .playing || GameState.current == .blackstone) { 

     guard usingThirdEye == false else { return } 

     let scoreLabel = childNode(withName: "scoreLabel") as! Score 
     let lane = [-100, -50 , 0, 50, 100] 
     let duration = 3.0 

     switch scoreLabel.number { 

       case 0...50: 
        frequency = 6.0 
        print("frequency has changed: \(frequency)") 
       case 51...100: 
        frequency = 4.5 
        print("frequency has changed: \(frequency)") 
       case 101...200000: 
        frequency = 1.1 
        print("frequency has changed: \(frequency)") 

       default: 
        return 
     } 

     let randomX = lane[Int(arc4random_uniform(UInt32(lane.count)))] 

     let object:Object = Object() 
     object.createFallingObject() 
     object.position = CGPoint(x: CGFloat(randomX), y: self.size.height) 
     object.zPosition = 20000 
     addChild(object) 


     let action = SKAction.moveTo(y: -450, duration: duration) 
     object.run(SKAction.repeatForever(action)) 

    } 

    } 

に変更された場合でも、同時に発射するようで発射する速度を変更していないようです周波数番号が低い番号に変更された場合、タイマーを速く起動させるにはどうすればよいですか?私は関数の最後にタイマを再作成する必要がありますか?

+2

このhttp://stackoverflow.com/questions/23978209/spritekitを読みます-creating-a-timer – Epsilon

+1

Astrum、これはSpriteKitに入る方法ではありません。主に、機能を一時停止する便利な方法がないためです。あなたの例のようなタイマーは、ゲームのループとペアになっていません。 SKActionsまたはupdate:メソッドを使用してください...上のリンクからのSteffenの答えに説明されています。 – Whirlwind

答えて

2

実際には、Timer、Spriteキットは独自の時間機能を使用しないようにしてください.Timerはうまく機能せず、管理するのが本当に苦痛です。代わりに

、待って、火災にはSKActionのを使用します。

let spawnNode = SKNode() 
override func didMove(to view: SKView) { 
    let wait = SKAction.wait(forDuration:frequency) 
    let spawn = SKAction.run(spawnFallingObjects) 
    spawnNode.run(SKAction.repeatForever(SKAction.sequence([wait,spawn]))) 
    addChild(spawnNode) 
} 

そして、それを高速化するために、ちょうど行います

switch scoreLabel.number { 

      case 0...50: 
       spawnNode.speed = 1 
       print("speed has changed: \(spawnNode.speed)") 

      case 51...100: 
       spawnNode.speed = 1.5 
       print("speed has changed: \(spawnNode.speed)") 

      case 101...200000: 
       spawnNode.speed = 2 
       print("speed has changed: \(spawnNode.speed)") 

      default: 
       return 
    } 
+0

働いてくれてありがとう、タイマーに関するアドバイスをいただきありがとうございました。 – Astrum

+0

@KnightOfDragon申し訳ありませんが、Switch Statementをどこに置いているのですか?ある機能やアップデート、あるいは別の場所で? –

+0

@ Eric.18何をしようとしていますか、この回答は非常にユーザー固有のものです – Knight0fDragon

0

timeIntervalのプロパティTimerは読み取り専用プロパティです。 (あなたのコードは新しいfrequencyをプロパティに書き込もうとしていません...)

機能の最後にタイマを再作成する必要がありますか?

ほとんどはい。ちょうど最後ににする必要はありません。このようなあなたの方法ヘッダーを変更して

func spawnFallingOjects(_ timer: Timer) { 

あなただけswitch scoreLabel.number {...}後にこのような何かを書くために必要があるかもしれませんので、あなたは、パラメータtimerを通じて発射Timerにアクセスすることができます。

 if frequency != timer.timeInterval { 
      //Invalidate old Timer... 
      timer.invalidate() 
      //And then allocate new one 
      Timer.scheduledTimer(timeInterval: frequency, target: self, selector: #selector(GameScene.spawnFallingOjects), userInfo: nil, repeats: true) 
     } 

既存のTimerisValidの場合)のfireDateプロパティを変更できますが、Timerを再作成しますスタンスは(SKSpriteNodeインスタンスを作成する場合と比較して)重い操作ではないため、新しいTimerを再作成するのはやや簡単です。

関連する問題