我不是在问如何实现这一点,这是一个足够简单的概念。我遇到的麻烦是花车。这是我的代码:
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 过量。
这一切对我来说几乎没有意义,如果有人能为我澄清这一点,我将不胜感激。也接受任何替代解决方案。如果需要更多代码或说明,我很乐意提供。