2017-04-11 7 views
2

私は物理シミュレーションをコード化しようとしています。私は自由落下をシミュレートして小さなものから始めます。私はJava JframeとJavaのawtライブラリからいくつかのメソッドを使用しています。しかし、私が直面している問題は、私のシミュレーションをもっと生き生きとさせるようにパラメータを調整することです。私のゲームwhileループは一定の60 FPSで動作します。つまり、各ループは16 msを要します。物理シミュレーション、ピクセルをメーターに調整しますか?

this.velX = this.velX + (accX)*delta; 
this.velY = this.velY + (accY) * delta ; 

this.velY = this.velY * 0.9; 


this.x = this.x + (int) ((this.velX) * delta); 
this.y = this.y + (int) ((this.velY)* delta); 

しかし、私はintに変換しているので、値は常に小さいので、値は常に0に戻ります。そして、シェイプの描画方法はintを受け入れるだけです(これは私が理解できると思いますが、それは解決策があるのだろうか)。ボールが動かなくなり、動きが目立たない(動いている場合)。

デルタを1にしてみましたが、うまくいきましたが、速すぎますが、現実的ではないと思います。したがって、誰かが私にそのような問題についての一般的なアイデアを与えることができれば非常に役に立ちます。

+1

「16ml秒」 - 16ミリリットル秒?私はそれが "ms" =ミリ秒であると思いますか? – Fildor

+3

レンダリングしている同じ場所から座標を読み取っているように聞こえます。これがまさに私の目の問題の原因です。座標を実際に必要な形式(つまり 'double'など)で受け入れ、それらをレンダリングするときにのみ' int'に変換するいくつかの専用オブジェクトに座標を格納してみてください。 –

+0

はい、申し訳ありません、私はそれを編集しました。 – Robot0110

答えて

1

問題は、これらの行にある

this.x = this.x + (int) ((this.velX) * delta); 
this.y = this.y + (int) ((this.velY)* delta); 

は、ここで問題があることなので、方程式は今

this.x = this.x + (int) deltaX; 
this.y = this.y + (int) deltaY; 

になるべき方程式の後半は((this.velX) * delta) and ((this.velY) * delta)

deltaX and deltaYという用語をすることができます deltaX and deltaYを整数に変換して、 x and yの位置への寄与をゼロに減らしています。

変更が長時間に渡って(フレーム数を超えて)小さくても、コントリビューションは重要になります。

deltaX.1であるとすると、10フレームに1ピクセルシフトを追加できるはずです。

あなたのdraw関数が整数を取る場合は、その行の位置値をその前の値に変換する必要があります。他のすべての目的には、float or doubleにする必要があります。

だから、方程式は、それが動作するはず

this.x = this.x + this.velX * delta; //this.x is float 
this.y = this.y + this.velY* delta; //this.x is float 

draw((int)x, (int)y) 

でなければなりません。

注:また、Javaがそうすることができないので、一定のフレームレートをどのように維持しているのかわかりません。可変フレームレートを考慮する必要があります。既にdeltaを使用して完了していること。デルタ値は一定であってはならず、すべてのフレームの終わりに計算される必要があります。

+0

ありがとうございます!これは実際に動作します!私は入力を処理した後に16ミリ秒間放置されたものに対してスリープするために典型的なthread.sleepを使用しています。それは間違っていますか? – Robot0110

+0

はい、 'Thread.sleep()'は、指定された正確な時刻にスレッドが起動することを保証しません。だから、 'System.currentTimeMillis()'を使ってスリープ時の実際の 'delta'値を計算することができます。それは完全に動作するはずです。 – 11thdimension

+0

@ user70319、もっと良いことに、 'java.util.concurrent.ScheduledExecutorService'を使ってみると、この便利なメソッド' scheduleAtFixedRate'があります。これはx時間単位ごとにいくつかのコードを実行できるようにします。スケジュールされたコードの実行が遅すぎて実行を完了できない場合は、そのインスタンスをキャッチして処理する必要があります。 –

関連する問題