2014-01-17 66 views
0

我一直在拍攝Em Up遊戲一段時間的問題,我真的無法找到任何答案。即使我按住空格鍵,我也只想拍1發子彈。用我目前的代碼,我根本不會發射任何子彈。我究竟做錯了什麼?C# - 僅拍攝一次 - IsKeyUp&IsKeyDown

 KeyboardState newState = Keyboard.GetState(); 
     KeyboardState oldState = Keyboard.GetState(); 

     if (oldState.IsKeyUp(Keys.Space) && newState.IsKeyDown(Keys.Space)) 
     { 
      bulletList.Add(new Bullet(content.Load<Texture2D>(@"bullet"), new Vector2(initialPos.X, initialPos.Y - 28), new Vector2(2, 4), spriteBatch)); 
     } 

     oldState = newState; 
+0

[這裏是示例](http://msdn.microsoft.com/en-us/library/bb203902.aspx) –

回答

1

你的問題是,你正在檢查,看看空格鍵是否上下,這是不可能的。我想你應該嘗試這樣的事:

bool readytofire = true; 
public override void Update() 
{ 
    KeyboardState newState = Keyboard.GetState(); 

    readytofire = !newState.IsKeyDown(Keys.Space); 

    if (newState.IsKeyDown(Keys.Space) && readytofire) 
    { 
     bulletList.Add(new Bullet(content.Load<Texture2D>(@"bullet"), new Vector2(initialPos.X, initialPos.Y - 28), new Vector2(2, 4), spriteBatch)); 
    } 
} 
+0

謝謝你,從來沒有想到這一點! –

+0

當然,很高興它有幫助。我剛剛意識到'readytofire'應該在if ... then語句之前更新(所以如果空格鍵上去了'readytofire'將更新調用是真的) – davidsbro

+0

這是一個有趣的方法,儘管所有的op必須做的是在循環外部定義oldState,然後只在它爲空時才分配它。 if(oldState == null)oldState = Keyboard.GetState();然後他的代碼的其餘部分會很好 – naed21

0

您在檢查之前設置舊狀態,所以它始終與newState相同。刪除該行: KeyboardState oldState = Keyboard.GetState();

您可能需要爲oldState首次分配一個值,使其在您的循環中運行。

0
KeyboardState newState = Keyboard.GetState(); 
KeyboardState oldState = Keyboard.GetState(); 

這些將具有相同的值。

if (oldState.IsKeyUp(Keys.Space) && newState.IsKeyDown(Keys.Space)) 

這是檢查Space鍵是UP還是DOWN。

這兩個代碼片段都沒有意義。這段代碼是否在循環中?如果是這樣,請檢查空間向下並使用布爾標誌來確保您只觸發一次。然後檢查空間UP,顛倒旗幟。