2012-04-03 30 views
1

我正在XNA中編寫一個簡單的遊戲,你在使用WSAD時移動一個精靈。問題是如果同時按下兩個相同方向的按鍵,則移動取消並且字符不移動。是否可以手動設置要釋放的密鑰以避免這種情況?這裏的關鍵是移動代碼:XNA設置鍵釋放?

if (newKeyState.IsKeyDown(Keys.W)) 
{ 
    position.Y -= vel; 
} 
if (newKeyState.IsKeyDown(Keys.S)) 
{ 
    position.Y += vel; 
} 
if (newKeyState.IsKeyDown(Keys.A)) 
{ 
    position.X -= vel; 
} 
if (newKeyState.IsKeyDown(Keys.D)) 
{ 
    position.X += vel; 
} 

回答

1

是否可以手動設置發佈來避免這種一鍵?

沒有。但是,您可以將其更改爲else-if。在這種情況下,按下W然後只有W將被計數。您可以通過更改首先檢查哪個鍵來改變這一點。

if (newKeyState.IsKeyDown(Keys.W)) { 
    position.Y -= vel; 
} else if (newKeyState.IsKeyDown(Keys.S)) { 
    position.Y += vel; 
} else if (newKeyState.IsKeyDown(Keys.A)) { 
    position.X -= vel; 
} else if (newKeyState.IsKeyDown(Keys.D)) { 
    position.X += vel; 
} 

如果您只想在每個軸上只移動一個方向。

if (newKeyState.IsKeyDown(Keys.W)) { 
    position.Y -= vel; 
} else if (newKeyState.IsKeyDown(Keys.S)) { 
    position.Y += vel; 
} 

if (newKeyState.IsKeyDown(Keys.A)) { 
    position.X -= vel; 
} else if (newKeyState.IsKeyDown(Keys.D)) { 
    position.X += vel; 
} 
1

的關鍵狀態(newKeyState在上面的代碼)表示鍵盤的實際物理狀態,所以它是既不可能也不可取關鍵的狀態設置爲解除時,用戶仍持下來。然而,有一些替代方案可以讓您達到預期的最終結果:

1)您可以重構您的代碼,例如,

if(newKeyState.IsKeyDown(Keys.W)) 
{ 
    position.Y -= vel; 
} 
else if(newKeyState.IsKeyDown(Keys.S)) 
{ 
    position.Y += vel; 
} 
// etc. 

2)您可以維護自己的狀態(即緩存的newKeyState版本),並設置鍵,在釋放。