1

Swing を使ってゲームを作成しましたが、少し信頼性が低く、Slick2D ゲーム エンジンを使用してリメイクし始めたところ、問題が発生しました。

update メソッドが呼び出されるたびに、ゲームの背景が一定のピクセル単位で画面上を移動します。これは加速と減速を繰り返すため、背景は非常に速く動き、次に非常に遅くなり、変動し続けます。

背景を移動する値で* by delta(リフレッシュレートを監視していると思います!)を試しましたが、これでは正確な値が得られないため、背景を左側にリセットするために使用できます(2背景移動右から左へ -800 ピクセルで左手が右に移動します)。

何が原因で、どうすれば克服できますか?

ありがとう

4

1 に答える 1

11

ここにいくつかの読み物があります(gamedev固有のStackExchangeサイトがあります、BTW):

これらの記事で最も重要なポイントの 1 つは、特定のフレーム数ではなく、時間の経過とともに特定の速度で移動することです。フレーム レートは予期せず変化する可能性があるため、時間ベースの動きとフレーム ベースの動きが互いに同等になることはありません。

そして、ここにいくつかの説明があります...

そのため、コンピューターと OS はマルチスレッド化されているため、アプリの外部で何が起こっているのか、マシンの全体的な負荷が何であるかを知ることはできません。このため、フルスクリーン モードであっても、CPU に排他的にアクセスすることはできません。これが、物事が速くなったり遅くなったりする理由の 1 つです。

Slick2D でのデルタの目的は、このスピードアップ/スローダウンに対処できるようにし、アプリがフレームレートを動的に変更できるようにして、画面上の知覚される動きがマシンの負荷によって変化しないようにすることです。デルタモニターのリフレッシュレートではありません(これは一定です)。デルタは、 への最後の呼び出しから経過したミリ秒数ですupdate

では、このデルタを適切に使用するにはどうすればよいでしょうか。背景が 100 ピクセル/秒の速度で移動することになっているとしましょう。デルタ ( への特定の呼び出しでupdate) が 33 ミリ秒の場合、この更新で背景を移動する必要がある量は、背景を 0.033 ピクセル移動する100*(33/1000.0) = 0.033ことになります。これは奇妙に思えるかもしれませんし、1 ピクセル未満で移動することのポイントが何であるか疑問に思うかもしれませんが、私に固執してください。

まず、1000 ではなく 1000.0 で除算する必要がある理由は、デルタの動きによって浮動小数点数が得られるようにするためです。

Slick2D の 2D グラフィックスは float 値を使用して配置を追跡していることに気付くでしょう。これは、デルタが何かを 0.033 ピクセル移動するように指示している場合、それを 0.033 ピクセル移動する必要があるためです。つまり、0 ピクセルでも 1 ピクセルでもありません。サブピクセルの動きは、フレームレートの増加/減少を滑らかにするためにも重要です。これは、いくつかのサブピクセルの動きに対する累積的な影響により、適切なタイミングでこれらの小さな動きがすべて合計されてピクセル全体になるためです。それは完全に滑らかで、正しい全体的な移動速度をもたらします。

画面はサブピクセル要素ではなく特定のピクセルに画像を解決するため、サブピクセルの動きをしても問題ないと思うかもしれませんが、すべての動きの追跡をフロートに変換すると、あなたが観察している効果がほとんどなくなることを確認してください。

于 2011-10-28T01:31:54.350 に答える