如何在xna中生成wp7的平滑运动



我想创建一个游戏并添加一个图像到我的游戏中,现在我想让它平滑地向下移动。我有一个这样的代码:

protected override void Update(GameTime gameTime)
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
            pos.Y = pos.Y + 1;
            base.Update(gameTime);
        }

移动工作,但它看起来不光滑,它看起来像它晃动。Pos是图像中位置的向量。

如何使它更光滑?

如果你想在不添加物理库的情况下流畅地移动,你只需要在位置更新中考虑gameTime。

protected override void Update(GameTime gameTime)
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
            pos.Y = pos.Y * 100 * (float)gameTime.ElapsedGameTime.TotalSeconds;
            base.Update(gameTime);
        }

我现在无法访问XNA + visual studio,但我所做的更改应该会给你一个尝试的想法。请记住,Update调用在一秒钟内发生多次,因此经过的时间将是一个较小的数字,因此您必须将其乘以一个更大的"移动"值(在本例中,我设置为100)。调整100,直到你看到你想要的移动速度

Beanish是对的,如果你想要平滑,你应该乘以GameTime。如果你只想让你的动画看起来流畅,那么物理效果是多余的。

我发现做动画的最好方法是使用位置插值,要做到这一点,你必须知道图像的初始位置(你已经知道了)和最终位置。

如果你想在2秒内从A移动到B,你可以使用下面的代码:

Vector2 a = new Vector2(0, 0);
Vector2 b = new Vector2(0, 100);
float elapsedTime = 0;
float duration = 2.0;
public override void Update(GameTime gameTime)
{
    float dt = (float)gameTime.ElapsedGameTime.TotalSeconds;
    elapsedTime += dt;
    if (elapsedTime > 1)
        elapsedTime = 1;
    float param = elapsedTime / duration;
    pos = Vector2.Lerp(a, b, param);
}

使用这种方法的最好的地方是,你现在可以使用"easing"来使你的动画看起来非常非常漂亮。

要做到这一点,只需在interpolator参数中添加一个Power操作:
pos = Vector2.Lerp(a, b, (float)Math.Pow(param /2.0, 0.5));

这将使您的图像在到达b时变慢。您可以使用指数值(0.5)来获得不同的结果,例如尝试2.0。

另一个重要的事情是,你的图像将永远停止在B。如果你使用欧拉积分方法(你的方法,每帧增加一个速度),你可能会有一些麻烦,使图像停止在正确的位置(又名B),当使用2或3个维度时,它会变得更糟。

要了解更多关于缓和,请查看Robert Penner的缓和方程

首先我可以告诉你不是什么问题。你不需要一个物理引擎来实现平滑的运动。并且将Update更改为包括ElapsedGameTime将不会对平滑度产生任何影响(假设您没有将IsFixedTimestep的默认值更改为false)。当有一个固定的时间步长时,ElapsedGameTime的值总是相同的,不会变化。

我不知道你在代码中做了多少,但如果太多,XNA将开始跳过代码的Draw部分,这肯定会导致不稳定。检查的一种方法是:在Update方法中,测试IsRunningSlowly的值。当它为真时,XNA将跳过一些Draw调用。

如果你没有做任何复杂的事情,那么罪魁祸首可能是你显示器的刷新率。如果它被设置为60Hz以外的任何东西,你会有抖动。你可以通过改变显示器的刷新率来解决这个问题。或者,您可以更改TargetElapsedTime的值以匹配监视器的速率。

你应该考虑在游戏中添加处理物理的库,例如FarseerPhysics。通过计算每个时间的位置和应用的物理规则,你的动作将是平滑和自然的。

最新更新