簡體   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