在XNA中模拟重力

5

我正在尝试在我的XNA 2D游戏中通过重力来为一个二维精灵添加动画效果。我已经开发了一个非常基本的类来实现这个仿真效果。以下是我的示例代码。

namespace Capture
{
class PhysX
{
    static Vector2 g = new Vector2(0.0f, 10.0f);
    public Vector2 pos, vel, acc, accumForce;
    public float mass;
    public bool USE_GRAVITY = true;

    /* Constructor */
    public void Engage(ref GameTime gameTime, uint maxX, uint maxY)
    {

        Vector2 F = Vector2.Zero;
        if (USE_GRAVITY)
        {
            F = accumForce + mass * g;
        }

        acc = F / mass;//This is the Net acceleration, Using Newtons 2nd Law
        vel += acc * gameTime.TotalGameTime.Seconds;// v = u + a*t
        pos += vel * gameTime.TotalGameTime.Seconds;// s = u*t + 0.5*a*t*t, 
        pos.X %= maxX;
        pos.Y %= maxY;

    }

    public void ApplyForce(ref Vector2 f)
    {
        accumForce += f;
    }
}
}

我在Game#Update(GameTime gt)方法中调用了PhysX#Engage()方法。问题在于动画不够流畅。这是因为位置坐标很快变得非常大。为了克服这个问题,我尝试使用取模运算,如代码中所示的Viewport.Width,Viewport.Height,但是位置坐标仍然不够平滑。我该怎么办?如何使动画更加流畅?请帮我解决问题。


你的质量设置是多少?质量越大,加速度越慢。 - Steve H
@SteveH 在力学中,力的质量项和质量的除法会相互抵消。重力加速度并不依赖于物体的质量。 - CodesInChaos
@Anurag 你的速度随时间线性增加。通常,你会引入一个与速度成线性关系的减速项来模拟摩擦力并限制终端速度。 - CodesInChaos
我不明白maxX和maxY的用途。你能解释一下吗?它们使用什么样的值? - Leggy7
1个回答

3
我认为这是因为您将经过的时间值作为整数进行了处理。
尝试使用考虑了分数部分的秒数的双倍值:
flaot dt = (float)GameTime.ElapsedGameTime.TotalSeconds;
vel += acc * dt;// v = u + a*t
pos += vel * dt;// s = u*t + 0.5*a*t*t,

此外:

这是因为位置很快变得非常大。

好的,你应该尽可能将浮点值保持在[-1,+1]范围内,否则会失去精度。我的建议是:

  1. 将对象的浮点属性保持在较小的范围内([-1,+1])
  2. 根据您的分辨率在绘制之前转换您的值

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接