2012-01-31 11 views
2

私が作業しているゲームでMathhelper.Clampを使用しているときに問題が発生しています。ここでは私の問題を引き起こしているコードの抜粋です:Mathhelper.Clampは正確ではありませんか?

基本的に
if (background.position.Y == 0) 
{ 
    player.position.Y = MathHelper.Clamp(player.position.Y, 0, viewport.Height/2); 
} 
if (Math.Abs(background.position.Y) == background.sprite.Height - viewport.Height/2) 
{ 
    player.position.Y = MathHelper.Clamp(player.position.Y, viewport.Height/2, viewport.Height - player.sprite.Height); 
} 
if (player.position.Y == viewport.Height/2) 
{ 
    background.position.Y = MathHelper.Clamp(background.position.Y, -(background.sprite.Height - viewport.Height/2), 0); 
} 

、私は何を達成するために望んでいることは(X、0から始まる)され、それが画面の真ん中に達するまで、プレイヤーのスプライトが下に移動させ、バックグラウンドはバックグラウンドの下端から画面の高さの半分を引いたところまで移動し、プレーヤーのスプライトは画面の下端に達するまで再び移動します。 (これを実現するためのコードがあります) - 私にとっては、これは2Dのサイドチェロにとってかなり一般的なカメラ機能のようです。

しかし、私が抱えている問題は、ポジションが正確に必要な数字に固定されていないということです。つまり、それらのポジションに依存しているコードが壊れているということです。具体的には、1つの余分なフレームの動きがクランプポイントを超えて許可されているように見えます。

これはうまくいかない理由があるのか​​、それとも動作させるためにできるのか分からない人は誰ですか?前もって感謝します!

答えて

4

浮動小数点数を比較するには、ほとんど常に間違っているので、==を使用しないでください。浮動小数点数は限定された精度しかないので、は常にでなければなりません。それらの差が所定のイプシロンより小さいかどうかを調べてください。このよう

// Difference less than one tenthousandth should be considered equal 
private const float Epsilon = 0.0001; 

public static bool FloatEquals(float f1, float f2) 
{ 
    return Math.Abs(f1 - f2) < Epsilon; 
} 
+0

浮動小数点精度のため2f/10fのような関数は0.2fと等しくないかもしれませんが、0.19999998〜になる可能性があります。残念ながら、デバッガはこれらを読み込み可能な形式に変換しようとするので、それを見ている。 C#で潜在的なプログラミングミスについて非常に多くの警告を発することで奇妙なことですが、これはまだ有効です。 – Marking

+0

洞察のおかげで、浮き沈みが間違っていることに気付かなかった。私はちょうどコードを改造し、代わりにintを使うかもしれないと思う。この場合、私は分数は必要ありませんが、私がしている時代のことを心に留めておくのは間違いありません。 – Andrux51

0

私は運動コードの前にクランプコードを入れて...私のクランプの境界の外のプレイヤーの位置を移動させている私が間違って何をしたか実現。それらを並べ替えることは、それをクリアしました!