2012-04-08 108 views
4

即時通訊工作在像「太空入侵者」這樣的簡單遊戲上,而我遇到了問題。 我試圖給用戶,儘可能從左到右移動的可能性,並在同一時間有可能使用「空格鍵」進行拍攝。WinForm:按下多個按鍵

我的問題是:當我按了更多然後1鍵,只有1個功能運行。

這裏的幾個東西,我想:

  1. 存放鑰匙在List<Keys>(但我沒有找到EXCUTE的功能,一切都變得亂七八糟什麼好辦法)的

    2.normal處理在key_down的事件是這樣的:

    protected void Form1_keysDown(object obj, KeyEventArgs e) 
    { 
        (e.KeyData == Keys.Space) 
         spaceShip.FireBullets(); 
    
        if (e.KeyCode == Keys.Left) 
         spaceShip.MoveLeft(); 
    
        if (e.KeyCode == Keys.Right) 
         spaceShip.MoveRight(); 
    } 
    

我qustion是:什麼是一個好辦法做這個工作?

(對不起,我的英語)

+2

除非必要,否則您應該使用XNA或DirectX或其他替代品來製作遊戲和圖形應用程序,而不是WinForms。他們不會變得過於活躍,你會在路上碰到很多障礙。 XNA的例子有一個鍵盤類,像IsKeyDown這樣的方法,所以它可以爲您節省很多時間。 – 2012-04-08 15:09:35

+0

感謝您在未來的重播mybee,當我感覺更舒適時,我將轉移到XNA。 – samy 2012-04-08 15:31:27

回答

7

你是依靠鍵盤控制器上,當你按住它重複鍵。當您按另一個鍵時,該功能停止工作。這需要不同的方法。

首先,您需要一個枚舉值,用於指示太空船的運動狀態,例如NotMoving,MovingLeft和MovingRight。將該類型的變量添加到您的類中。您將需要KeyDown KeyUp事件。當你得到一個KeyDown,例如Keys.Left,然後將該變量設置爲MovingLeft。當你得到Keys.Left的KeyUp事件時,首先檢查狀態變量是否仍然是MovingLeft,如果是,則將其更改爲NotMoving。

在你的遊戲循環中,使用變量值來移動飛船。一些示例代碼:

private enum ShipMotionState { NotMoving, MovingLeft, MovingRight }; 
    private ShipMotionState shipMotion = ShipMotionState.NotMoving; 

    protected override void OnKeyDown(KeyEventArgs e) { 
     if (e.KeyData == Keys.Left) shipMotion = ShipMotionState.MovingLeft; 
     if (e.KeyData == Keys.Right) shipMotion = ShipMotionState.MovingRight; 
     base.OnKeyDown(e); 
    } 
    protected override void OnKeyUp(KeyEventArgs e) { 
     if ((e.KeyData == Keys.Left && shipMotion == ShipMotionState.MovingLeft) || 
      (e.KeyData == Keys.Right && shipMotion == ShipMotionState.MovingRight) { 
      shipMotion = ShipMotionState.NotMoving; 
     } 
     base.OnKeyUp(e); 
    } 

    private void GameLoop_Tick(object sender, EventArgs e) { 
     if (shipMotion == ShipMotionState.MovingLeft) spaceShip.MoveLeft(); 
     if (shipMotion == ShipMotionState.MovingRight) spaceShip.MoveRight(); 
     // etc.. 
    }