2016-12-29 2 views
6

Я пытаюсь вычислить прошедшую секунду в deltaTime, но я не уверен, как это сделать, потому что мой deltaTime постоянно печатает 0.0166 или 0.0167.Как правильно рассчитать 1 секунду с deltaTime в Swift

Вот мой код:

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

    deltaTime = currentTime - lastTime 
    lastTime = currentTime 

Как сделать так, что я могу сжать некоторую логику здесь, чтобы работать каждый второй?

EDIT: Я смог придумать следующее, но есть ли лучший способ?

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

Как называется «обновление»? Вы используете CADisplayLink? Или что? – matt

+0

Каждый кадр в одной сцене с использованием SpriteKite. – tbaldw02

+0

Ваша сцена работает на 60 FPS, поэтому каждый кадр составляет ~ 16,6 мс друг от друга. Что именно вы пытаетесь достичь? – Alexander

ответ

4

Я всегда использую SKActions для такого рода вещи: (написано в скор 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 таймер, так что тогда вы должны поддерживать массив таймеров и таблицу интервалов и блоков вызова. Это начинает становиться очень сложным и очень вероятно, вы должны просто использовать встроенный в блок таймера в ИО 10, который является гораздо более прямо вперед:

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

Вам следует избегать использования таймера в SpriteKit. Это далеко не идеально. Вы должны придерживаться метода обновления или SKActions. Это связано с тем, что таймер (NSTimer) не сопряжен с игровым циклом. Значит, вам придется реализовать пользовательскую функцию приостановки. Таймер не учитывает приостановленное состояние узла, сцены или представления, поэтому во многих ситуациях вам придется делать недействительными/воссоздавать и прочее. – Whirlwind

Смежные вопросы