2

作業中のゲームで 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

2 に答える 2

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;
}
于 2012-01-31T10:21:29.490 に答える
0

プレイヤーの位置がクランプの境界の外に移動するという私が間違っていたことに気付きました...移動コードの前にクランプコードを置きました。それらを並べ替えると、それがすぐにクリアされました!

于 2012-01-31T21:35:58.363 に答える