2015-05-03 77 views
0

好吧,你說你玩的是自上而下的遊戲。您按WD進入正確的方向。現在你只是想正確的,所以你釋放W鍵。人們會希望你然後改變方向並向右轉,但相反,你繼續向右。我能做些什麼來解決這個問題? 這裏是我的代碼:XNA Diagonal Movement Key Release

 if (kb.IsKeyDown(Keys.W) || kb.IsKeyDown(Keys.A) || kb.IsKeyDown(Keys.S) || kb.IsKeyDown(Keys.D)) 
     { 
      if (kb.IsKeyDown(Keys.W)) 
       velocity.Y = -movespeed; 
      else if (kb.IsKeyDown(Keys.A)) 
       velocity.X = -movespeed; 
      else if (kb.IsKeyDown(Keys.S)) 
       velocity.Y = movespeed; 
      else if (kb.IsKeyDown(Keys.D)) 
       velocity.X = movespeed; 
      else if (kb.IsKeyDown(Keys.W) && kb.IsKeyDown(Keys.D)) 
      { 
       velocity.X = movespeed; 
       velocity.Y = -movespeed; 
      } 
      else if (kb.IsKeyDown(Keys.W) && kb.IsKeyDown(Keys.A)) 
      { 
       velocity.X = -movespeed; 
       velocity.Y = -movespeed; 
      } 
      else if (kb.IsKeyDown(Keys.S) && kb.IsKeyDown(Keys.D)) 
      { 
       velocity.X = movespeed; 
       velocity.Y = movespeed; 
      } 
      else if (kb.IsKeyDown(Keys.S) && kb.IsKeyDown(Keys.A)) 
      { 
       velocity.X = -movespeed; 
       velocity.Y = movespeed; 
      } 
     } 
     else 
      velocity *= .9f; 

     position += velocity; 

回答

0

所以我經過幾個小時的鬥爭後自己想出了答案。

只需在檢查前將速度設置爲零: 編輯:乘以.89實際上是爲了更平滑的運動。

 if (kb.IsKeyDown(Keys.W) || kb.IsKeyDown(Keys.A) || kb.IsKeyDown(Keys.S) || kb.IsKeyDown(Keys.D)) 
     { 
      velocity *= .89f 
      if (kb.IsKeyDown(Keys.W)) 
       velocity.Y = -movespeed; 
      if (kb.IsKeyDown(Keys.A)) 
       velocity.X = -movespeed; 
      if (kb.IsKeyDown(Keys.S)) 
       velocity.Y = movespeed; 
      if (kb.IsKeyDown(Keys.D)) 
       velocity.X = movespeed; 
     } 
     else 
      velocity *= .9f; 
+0

您是否認爲對角線速度比向上/向下/向左/向右移動要快?一種解決方案是使速度正常化,然後乘以速度。另一種是如果運動是對角的,則用'sqrt(2)'分割速度。 –

+0

不,我沒有。你能詳細說明一下嗎? – omni

+0

對角線速度將是'速度幅度* sqrt(2)'。 – snahor