これを実装する方法を尋ねているわけではありません。それは十分に単純な概念です。私が問題を抱えているのはフロートです。これが私のコードです:
Position += mVelocity;
if (!Keyboard.GetState().IsKeyDown(Keys.Left) && !Keyboard.GetState().IsKeyDown(Keys.Right) && !Keyboard.GetState().IsKeyDown(Keys.Down) && !Keyboard.GetState().IsKeyDown(Keys.Up))
{
if (mVelocity.X != 0.0F)
{
if (mVelocity.X > 0.0F)
mVelocity.X -= mFriction;
if (mVelocity.X < 0.0F)
mVelocity.X += mFriction;
}
if (mVelocity.Y != 0.0F)
{
if (mVelocity.Y > 0.0F)
mVelocity.Y -= mFriction;
if (mVelocity.Y < 0.0F)
mVelocity.Y += mFriction;
}
}
Console.WriteLine(mVelocity.X + ", " + mVelocity.Y);
mFriction は 0.2F です。
問題は、プレイヤーを正の速度 (X または Y) で動かすと、摩擦が正常に機能し、速度が 0.0 に低下することです。しかし、負の速度で彼を動かすと、摩擦が追加され、何らかの理由で 0.0 で停止せず、停止する前に 0.2 まで上昇します。このため、プレーヤーが動いていて、キーを離すと、反対方向にゆっくりとスライドし始めます。どうしてこれなの?どうすれば修正できますか?
さらに、テスト用に次のコードを試しました。
if (mVelocity.X == 0.2F)
mVelocity.X = 0.0F;
if (mVelocity.Y == 0.2F)
mVelocity.Y = 0.0F;
しかし、コードを追加しなかった場合とまったく同じ結果が得られます。どうやら、0.2F は 0.2F と等しくありません。これは何ですか?
最後に、デバッグ出力では、プレイヤーが積極的に動いて静止している (おそらく停止している) とき、x と y の両方の速度 (私が彼を動かした方法によって異なります) は 2.980232E-08 です。私はこれを理解していません。彼の速度を 1 に設定し、フレームごとに正確に 0.2 を減算すると、なぜ 1.0、0.8、0.6、0.4、0.2、0.0 以外になるのでしょうか? それに続いて、彼が負の動きから静止している場合、x と y の速度 (これも、私が彼を動かす方法によって異なります) は 0.2 です。-1、-0.8、-0.6、-0.4、-0.2、0.0 にならないのはなぜですか? 0.0 から 0.2 を超える代わりに。
これは私にはほとんど意味がありません。誰かが私のためにこれを解決してくれたら、私は感謝します. 代替ソリューションも受け入れられます。さらにコードや説明が必要な場合は、喜んで提供します。