2014-02-24 27 views
-1

你好,我在XNA一些麻煩,在這裏我的代碼 我做一個陣列的4KeyboardState在XNA C#

//Initialize 
Keyboard oldState = Keyboard.GetState(); 
int index = 0; 

//Update 
KeyboardState currentState = Keyboard.GetState(); 
if (index != 0 && ((currentState.IsKeyDown(Keys.Z) || currentState.IsKeyDown(Keys.Up)) 
     && ((!oldState.IsKeyDown(Keys.Z)) || (!oldState.IsKeyDown(Keys.Up))))) 
     { 
      index = index - 1; 
     } 
     else if (index < menuArray.Length && ((currentState.IsKeyDown(Keys.S) || currentState.IsKeyDown(Keys.Down)) 
     && ((!oldState.IsKeyDown(Keys.S)) || (!oldState.IsKeyDown(Keys.Down))))) 
     { 
      index = index + 1; 
     } 
oldState = currentState; 
if (index == 0) 
    //put the texture here 
if (index == 1) 
    //put the texture here 
if (index == 2) 
    // put the texture here 
if (index == 3) 
    // put the texture here 

我的主要問題是,當我按上/ Z或向下/ S的長度,如果我沒有按下光標,光標將從3跳到3或從0跳到0 您能幫我解決這個問題嗎?

+0

您正在過度使用oldstate變量。所以這兩個變量總是相等的。此外,您需要記住這部分代碼每次調用時都會運行,通常約爲60 fps。 – deathismyfriend

回答

0

問題是'if'語句布爾邏輯(和覆蓋oldState無關)。

考慮這種情況:

索引= 0

S被壓下。我們正在嘗試增加索引。

要使索引遞增,舊狀態鍵S必須向上或舊狀態鍵向下必須向上。

注意OR,這是問題所在。即使在下一幀中,oldState S沒有啓動,Down鍵仍處於啓動狀態,所以OR語句將始終返回true,除非兩個鍵同時被按下。此時索引每幀都會增加(非常快),同時按下S按鈕。最簡單的方法是將oldState S和Down之間的OR更改爲AND。

!oldState.IsKeyDown(Keys.S) && !oldState.IsKeyDown(Keys.Down) 

!oldState.IsKeyDown(Keys.Z) && (!oldState.IsKeyDown(Keys.Up) 

您還可以使用IsKeyUp()的清晰度。

oldState.IsKeyUp(Keys.S)) && oldState.IsKeyUp(Keys.Down)