2011-11-02 12 views
6

私はいくつかの簡単な2Dゲームプログラミングを練習しており、アニメーション中には(画像位置の実際の変化は浮動小数点数で最もよく計算される)という理論を思いつきました。私はintを使ってイメージを動かすと、アニメーションが滑らかにならないという気持ちがあります。double(またはfloat)をintに変換するとどうなりますか?

Javaでは、浮動小数点数を使って画像を描画して、画像に位置を与えることはできないようです。しかし、最初にあなたがxyと宣言したときに、それらをDoubleまたはFloatとして宣言することができます。実際に画像を描画するには、それらをintにキャストする必要があります。私のように見つけるHERE

/** 
* Draw this entity to the graphics context provided 
* 
* @param g The graphics context on which to draw 
*/ 
public void draw(Graphics g) { 
    sprite.draw(g,(int) x,(int) y); 
} 

私の質問はどのように変換を処理するのですか? コードがこれらのダブルスを最後にキャストした場合、なぜそれらを最初に倍にするのでしょうか? Javaは10進数の後に数字を隠しますか?

私はCとC++で小数点以下の数字が切り捨てられ、その前に何が表示されるのか分かります。 Javaはこのキャストをどのように処理しますか?

+2

ちょうどC、C++と同じ小数点以下を削除します。 http://www.fluffycat.com/Java/Cas​​ting/ – dmcnelis

+0

できるだけ2倍の計算が必要です。最後にintを受け入れるメソッドに渡すと、Math.round()が実行されます。 – Stephan

答えて

4

ディスプレイ上のピクセルは離散的であり、数に制限があります。したがって、ディスプレイ座標は整数でなければなりません。浮動小数点数は意味がありません。 (341.4, 234,7)

つまり、整数は最終描画段階でのみ使用する必要があります。オブジェクトの動き、速度などを計算するときは、浮動小数点数を使用する必要があります。整数は、驚くほど多くの精度問題を引き起こします。次のスニペットを考えてみましょう:axは、浮動小数点数をしている場合

a = 1; 
x = (a/2) * 2; 

xは最終的に1数の期待値を持つことになります。整数の場合は0になります。

ベースライン:物理計算に浮動小数点タイプを使用し、描画時にintに変換します。これにより、必要な精度で物理計算を行うことができます。

EDIT:限り整数と浮動小数点数から変換に関しては

、FP番号がより大きな範囲を有するが、あなたの描画領域サイズに正規化した後に、物理計算によって生成される値は、通常オーバーフローべきではありませんタイプ。成果物を作成することができる整数型、(639.9639なく640に変換され、例えばによる右端の画素列でない画素を有する例えばアニメーション)に変換するときJavaは浮動小数点数を切り捨て、前記

。より合理的な結果を得るためには、Math.round()またはその他のJavaで提供される四捨五入メソッドを参照してください。

2

Javaキャストは小数点以下を切り捨てて整数に浮動小数点数を返します。しかし、浮動小数点のx座標とy座標が意味をなさないとは思わない。 1ピクセル未満では表示できない画面上のピクセルがあります。たとえば、ピクセル.5px x .5pxを描画することはできません。画面上では、ピクセルは1px x 1pxピクセルになるからです。私はコンピュータゲームのプログラマーではありませんが、私はJavaで1つのアニメーションエンジンを書いており、非常に滑らかでした。あなたが望むなら私はこれを共有することができます。

intを使用して描画する必要がありますが、計算をすべてdouble型で行う必要があることに注意してください。回転のようなものや数式に依存するものについては、10進数で行う必要があります。

+1

浮動小数点はさまざまな理由で便利です。その中で、 'sin' /' cos'(実用的な回転にはほとんど必要です)が実際に必要です。多くの行列演算は、数値が小数点以下の値を取る能力から利益を得ることができます。 intに変換すると、柔軟性を失うことになります(独自の整数trig関数などを書いていない限り)。だからこそ、彼らは絶対にintでなければならないまで、それらを倍数または浮動小数点数に保つでしょう。 – cHao

+0

これは本当です。私はintであなたの計算をするつもりはありませんでした。私のアプリケーションでは、すべての計算を二重で行い、intを使って描画します。私はこのメモを反映するように更新します。 –

+0

@AmirRaminfar私はそれを見ることができますか? – mastrgamr

3

Javaは小数点以下を切り捨てます。例:

(int) 2.34 == 2 
(int) 2.90 == 2 

浮上位置に描画することができない理由は

+0

を参照してください。入力をありがとう、それは – mastrgamr

1

理由xとダブルスを可能にするyの必要性は、彼らがする必要があるときのためにある:)何の半分のピクセルなどがないということだけです例えば、数学的に計算される:

x += (delta * dx)/1000; 

あなたはピクセルをペイントするまでオーバーフローと精度アップの損失を回避したいです。

+0

のように私はダブルがキャストされる前に、それができるだけ正確なintに最も近い正確に近づくように計算されると思いますか? (それがO_oを意味する場合) – mastrgamr

関連する問題