2016-12-29 5 views
6

deltaTimeは常に0.0166または0.0167を出力するため、deltaTimeで経過秒を計算しようとしていますが、どうすればよいか分かりません。ここでSwiftでdeltaTimeで1秒を正しく計算する方法

は私のコードです:

override func update(_ currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 

    deltaTime = currentTime - lastTime 
    lastTime = currentTime 

は、どのように私はそれが私が毎秒を実行するには、ここでいくつかのロジックを絞ることができます作るのですか?

編集:私は以下を考え出すことができましたが、良い方法がありますか?

  deltaTimeTemp += deltaTime 
      if (deltaTimeTemp >= 1.0) { 
       print(deltaTimeTemp) 
       deltaTimeTemp = 0 
      } 
+1

「更新」はどのように呼び出されていますか? CADisplayLinkを使用していますか?または何? – matt

+0

SpriteKiteを使用する単一のシーンゲーム内のすべてのフレーム。 – tbaldw02

+0

あなたのシーンは60 FPSで動作しているので、各フレームは〜16.6 ms離れています。あなたは正確に何を達成しようとしていますか? – Alexander

答えて

4

:(SWIFTで書かれました3)

let wait = SKAction.wait(forDuration: 1.0) 
let spawnSomething = SKAction.run { 
    //code to spawn whatever you need 
} 

let repeatSpawnAction = SKAction.repeatForever(SKAction.sequence([wait, spawnSomething])) 

self.run(repeatSpawnAction) 
+0

ありがとう!私はこれを撃つだろう。 – tbaldw02

0

あなたが本当に唯一、あなたはすべてのフレームのデルタを格納すべきではない1秒間隔を気にしている場合。開始時間を保存し、各フレームの経過時間を計算するだけです。経過時間が1秒間隔を超えると、開始時刻が現在の時刻にリセットされます。

override func update(_ currentTime: CFTimeInterval) { 
     let elpasedTimeSinceLastupdate = currentTime - startTime 
     //Check if enough time has elapsed otherwise there is nothing to do 
     guard elpasedTimeSinceLastupdate > requiredTimeIntervale else { 
     return 
     } 
     startTime = currentTime 
     // Do stuff here 
    } 

私は、理想的には、あなたは、1つの以上のタイマーをしたいので、あなたはコールするタイマーの配列や間隔やブロックのテーブルを維持する必要があります。これは非常に複雑になり始め、本当にあなたがおそらくはるかに簡単であるiOSの10、中ブロックタイマーに建て使用する必要があります:私はいつもの事のこのタイプのSKActionsを使用

_ = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in 
     //Do stuff every second here 
    } 
+2

SpriteKitでTimerを使用しないでください。それは理想から遠いです。更新メソッドまたはSKActionsに固執する必要があります。これは、Timer(NSTimer)がゲームループとペア設定されていないためです。つまり、カスタムポーズ機能を実装する必要があります。タイマーはノード、シーン、またはビューの一時停止状態を尊重しないため、多くの状況では無効化/再作成して処理する必要があります。 – Whirlwind

関連する問題