繁体   English   中英

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

[英]howto generate a smooth movement in xna for 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);
}

使用这种方法的最好之处在于,您现在可以使用“缓动”使动画看起来真的非常好。

为此,只需将Power操作添加到interpolator参数:

pos = Vector2.Lerp(a, b, (float)Math.Pow(param /2.0, 0.5));

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

另一个重要的事情是您的图像将始终停在B点。如果您使用Euler积分方法(您的方法,每帧增加一个速度),则可能难以使图像停在正确的位置(也称为B点),并且使用2或3个维度时甚至更糟。

要了解有关宽松的更多信息,请查看Robert Penner的Easing Equations

首先,我可以告诉您问题所在。 您不需要物理引擎即可平滑移动。 并且将Update更改为包括ElapsedGameTime不会对平滑度造成任何影响(假设您尚未将IsFixedTimestep的默认值IsFixedTimestep为false)。 当有固定的时间步长时, ElapsedGameTime将始终具有相同的值,并且不会变化。

我并没有在代码中做多少事情,但是如果过多,XNA将开始跳过代码的Draw部分,这肯定会引起混乱。 一种检查方式:在Update方法中,测试IsRunningSlowly的值。 只要为真,XNA都会跳过一些Draw调用。

如果您没有做任何复杂的事情,那么罪魁祸首可能就是显示器的刷新率。 如果将其设置为60Hz以外的任何其他值,则可能会出现混响。 您可以通过更改显示器的刷新率来解决此问题。 或者,您可以更改TargetElapsedTime的值以匹配监视器的速率。

您应该考虑在游戏中添加一个用于处理物理的库,例如FarseerPhysics 通过应用物理规则计算每个时基的位置,您的动作将变得顺畅自然。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM