[英]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.