私はSwingを使ってゲームを作りました。それは少し信頼できませんでしたので、Slick2Dゲームエンジンを使って作り直し始めました。問題が発生しました。
ゲームの背景は、更新メソッドが呼び出されるたびに特定のピクセル数で画面を横切って移動します。これは、スピードアップとスローダウンを続けるので、バックグラウンドは非常に速く動き、その後は非常に遅くなり、変動し続けます。
私はバックグラウンドを動かす私の価値についてデルタ(リフレッシュレートを監視していると思う!)を試しましたが、これは私には正確な値を与えませんでしたので、バックグラウンドを左側にリセットすることができます右から左へ、左から1つは右に-800ピクセル)。
これを引き起こしていると私はどのようにそれを克服するのですか?
ありがとう
ここにいくつかの読者がいます( gamedev固有のStackExchangeサイトがあります)。
これらの記事の中で最も重要な点の1つは、一定数以上のフレームではなく、一定の割合で物事が動くことです。フレームレートは予期せず変化する可能性があるため、時間ベースおよびフレームベースの動きは互いに等価ではありません。
ここにいくつかの説明があります...
したがって、お使いのコンピュータとOSはマルチスレッド化されているため、アプリケーションの外部で何が起きているのか、マシン全体の負荷は何か分かりません。このため、フルスクリーンモードであっても、CPUへの排他的アクセスは得られません。それは、物事がスピードアップして減速する理由の1つです。
Slick2Dのデルタの目的は、このスピードアップ/スローダウンに対処し、フレームレートを動的に変更できるようにして、知覚された動きが画面上で変化しないようにすることですあなたのマシンの負荷。デルタは、リフレッシュレート(一定)を監視するものではありません。 deltaは最後の update
の呼び出しから経過したミリ秒数です。
So how do you use this delta properly? Let's say your background is supposed to move at a rate of 100px/sec. If the delta (on a given call to update
) is 33 milliseconds, then the amount you should move your background on this update is 100*(33/1000.0) = 0.033
- so you would move your background by 0.033 pixels. This might seem weird, and you may wonder what the point is of moving <1 pixel, but stick with me.
まず、1000の代わりに1000.0で除算しなければならない理由は、浮動小数点数を与えるためにデルタの移動を必要するためです。
Slick2Dの2Dグラフィックスの要素は浮動小数点値を使って物の配置を追跡することに気付くでしょう。これは、デルタから0.033ピクセルだけ移動するよう指示された場合、0.033で移動する必要があります(0ではなく1ピクセルにする必要があります)。サブピクセルの動きは、フレームレートの増減を滑らかにするためにも重要です。なぜなら、いくつかのサブピクセルの動きに対する累積的な効果は、瞬間が正しければすべての小さな動きがピクセル全体に加わるからです。それは完全に滑らかであり、正しい全体的な移動率をもたらす。
あなたの画面はサブピクセル要素ではなく特定のピクセルに画像を変換するので、サブピクセルの動きをするかどうかは関係ありませんが、すべての動き追跡を浮動小数点に変換すると、観察している効果が大きく消えていることを確認してください。