2016-07-06 4 views
6

質問update(currentTime:)の関数SKSceneは、currentTime引数を持つすべてのフレームと呼ばれます。私はどのように機能を使用せずに同じソースから時間を得るのだろうと思っています。update(currentTime:)私はCFAbsoluteTimeGetCurrent()が違うだけだと分かった。アップデート(currentTime :)関数が同じ時刻を取得する方法は? (呼び出される前に)

理由:timeSinceLastUpdateを計算するには、timeOfLastUpdateというインスタンス変数が必要です。 timeOfLastUpdateを実装するには、最初の更新前に任意の値に設定して、最初の計算をtimeSinceLastUpdateにする必要があります。あなたはこれを検出するか、またはオプションを使用する単純なif文を持つことができますが、それはdidMoveToView(view:)timeOfLastUpdateを設定するだけで避けることができる不要な分岐です。それが私がやろうとしていることです。

+0

私は、 'currentTime'がデバイスが実行されている時間を秒単位で返します。つまり、再起動するたびにリセットされます。この価値を得る方法はありますが、あなたがやっていることについては、リックスターの答えが行く方法です。 – mogelbuster

答えて

4

最初のtimeSinceLastUpdateは、残りの部分と常に異なります。通常、前のupdateコールからの絶対時間を格納し、現在のコールの時間から減算してtimeSinceLastUpdateを取得します。レンダリングループを最初に通過しているために前の時間が存在しない場合 - レンダリングループはゼロまたは無限大または負の何かに設定されているか、または初期化した任意のセンチネル値に設定されます。開始するためにはtimeSinceLastUpdateを公称値に設定します。あなたのフレーム間隔(60 fpsに行く場合は16.67 ms)のようなものが意味をなさないでしょう。時間間隔に依存しているゲームコードが0または非常に大きな値を渡したために何か野生をしたくないと思っています。

実際、あなたのユーザーがゲームを一時停止して再開したため、timeSinceLastUpdateを正規化してfooが大きくなった場合に正常なものにするロジックを持つのは悪い考えではありません。動きがある種のposition += velocity * timeSinceLastUpdateモデルに従ったゲームエンティティ(GameplayKitエージェントなど)を持っている場合は、一時停止から再開したときに1フレームの時間だけ移動し、5分間の休止時間の速度を使わずにジャンプする超空間。

以前の時間をゼロに初期化し、予想されるフレーム間隔を減算して正規化すると、同じコードで開始と終了の両方のケースがカバーされます。あなたはいつもCOALESCEを使用することができ

+0

私は 'didMoveToView'メソッドから"前の "時間を取得する方法を知っています。現在のソリューションでは、最初の更新時に1回だけ必要であっても、1秒あたり60回のブール式の評価が必要なためです。 – Mazen

+1

私が指摘したように、そのブールチェックは最初の更新以外の目的には便利です。そして、更新方法で何千倍も速いのですが、私が得意とするのは、そのチェックを最適化するための架空の "前の"時間を発明しようとすると、物事を考えるよりも時間がかかります。 – rickster

2

:最初のループで

let deltaTime = currentTime - (previousTime ?? currentTime). 

を、あなたのdeltaTimeが、それは当然のpreviousTime変更

このため、オプションでなければならないの後に0(このする必要があります)です

関連する問題