1

我不是在问如何实现这一点,这是一个足够简单的概念。我遇到的麻烦是花车。这是我的代码:

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 过量。

这一切对我来说几乎没有意义,如果有人能为我澄清这一点,我将不胜感激。也接受任何替代解决方案。如果需要更多代码或说明,我很乐意提供。

4

2 回答 2

5

问题是您的相等性测试由于不精确而失败,例如,角色继续移动一帧。

浮点数从根本上说是不精确的,所以理论上,2.0f * 5.0f 不一定 == 10.0f。它可能是 9.999999f 或 10.000001f。不要测试两个浮点数是否相等:测试它们是否在足够小的区间内,即:

// test approximate equality between f1 and f2
bool areEqual(float f1, float f2) {
    return Math.Abs(f1 - f2) < EqualityThreshold; // where EqualityThreshold is a small constant
}

另请阅读http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

于 2012-04-19T04:41:00.093 回答
1

您需要为最低速度使用一些阈值。在现实生活中,我们既有动摩擦,也有静摩擦。前者是对我们不利的力量,而后者是我们克服任何运动发生的力量。

你在那里有动摩擦,但你缺少静态。

我意识到您的问题纯粹是浮点精度,但是如果您正在构建强大的物理,请记住两种类型的摩擦以及有关力和运动的其他规则。

于 2012-04-20T04:09:10.517 回答