私は答えを完全に書き直して明確にすることに決めました。
まず、FPSの問題を間違った方向に向けると思います。あなたがデバイスが与えることができるよりも速いフレームレートを "強制"することはできません。すべてのフレームが一貫していると仮定してゲームの動きを基準にしている場合は、間違っています。 CPUが非常に遅く、ある世代から新しい世代への違いが最初はあまりにも悪くなかったので、それは実際に彼らがどのように初期の段階で行ったかです。若いハードウェアで古いDOSゲームを走らせるのは、フレームレートが非常に高く、ゲームメカニック全体が不安定になったり、プレイするには速すぎたりするので、難しいでしょう。
ここでのコンセプトは、「時間をかけて」考えることと、2つのフレーム間に経過した時間に関連して任意の動作を縮小することです。
update()
メソッドは、すべてのフレームで現在のシステムクロック状態を提供することで、この機会を提供します。最後のフレームの時間を記録することで、現在のフレームとの時間差を計算し、その差を使って現在のフレームを縮小することができます。
タイマーを使用して一貫したフレームレートでアップデートを取得することはお勧めしません。一定の時間間隔で更新クロージャを呼び出すかもしれませんが、クロージャ内のコードは単独で実行する時間がかかっており、ゲームロジックによっては実行時間が異なることさえあります。したがって、一時停止のタイミングは一貫しているかもしれませんが、一時停止前後のコードは一貫していない可能性があります。それでは、低速のCPUでゲームを動かすとどうなりますか?コードの速度がさらに変わり、タイミングが不正確になります。
あなたのゲームループにSKAction
を使用しないことに対するもう1つの点は、単純にそれらが何であるかです。アクションはメモリ内のオブジェクトであり、複数のオブジェクトによって再利用されます。例えば「ジャンプ」アクションを行っている場合は、そのアクションをどこかに保存し、ノードが何であっても「ジャンプする」必要があるたびに同じオブジェクトを再利用することをお勧めします。ゲームループはフレームごとに実行されますが、異なるオブジェクトでは実行されません。アクションも使い捨てです。それが実行中であってもアクションを殺すことができるという意味です。あなたのゲームループをアクションに入れたら、おそらくSKScene
によって実行されます。あなたのシーンで別のアクションを使用する場合は、直ちにパズルになります。これは、アクションを削除するだけでなく、すべてのアクションを削除するか、識別子キーを使用してアクションを作成し、そのキーを使用してアクションを削除するその鍵ですでに表示されていない場合は、シーンによって実行されるすべてのアクションに識別子を付け、それらを1つずつ削除するように強制します。そして再び彼らはあなたのゲームループを取り除くミスのためにドアを開いたままにしておきます。その後、あなたのアクションが最初に1フレームごとに実行される保証はありません。
なぜupdate()
メソッドを使用しますか?あなたのシーンに組み込まれているからです。何であれ、毎フレーム、update()
が最初に呼び出されます。その後、アクションが実行されます。できるだけアクションのようにupdate()
メソッドを誤ってフラッシュすることはできません。アクションのようにクロージャー内のオブジェクトを参照しているため、メモリリークを引き起こす強い/弱い関係には注意する必要はありません。推奨
を読み取ります
- SKAction API reference:あなたは明らかにこれらのポイントを逃しました。
- SKScene API reference:spritekitのフレーム処理について読んでください。それは、どのようにすべてのフレームにすべてをまとめているかを理解するのに役立ちます。
私はそれが物事をより明確にすることを望む。
私は 'update'関数が' SKScene'にあると思いますか?それを使用してください。 – EmilioPelaez
@EmilioPelaez速いスピードか同じスピードがありますが、一定のペースで走っています – joshLor
私は適切な答えを追加しました。 – EmilioPelaez