2012-04-08 18 views
4

"space invaders"のような単純なゲームに取り組んでいて、問題が発生しました。 私はユーザーに、左から右に向かって移動したいと同時に、スペースバーを使って撮影する可能性を与えようとしています。WinForm:複数のキーが押された

私の問題は:1つ以上のキーを押したとき、1つの機能しか実行されません。ここ

私が試したいくつかのもの:List<Keys>で鍵を格納

  1. を(私は乱雑になる機能や、すべてをexcuteする何か良い方法を見つけるdidntは)

    の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

必要でない限り、WinFormsではなくゲームやグラフィックス重視のアプリケーションを作成するには、XNA、DirectX、または代替方法を使用する必要があります。彼らはあまりにもダイナミックに作られていないし、あなたの途中で多くの壁を打つでしょう。例えば、XNAはIsKeyDownのようなメソッドを持つKeyboardクラスを持っているので、時間を大幅に節約することができます。 –

+0

私はより快適に感じるとき、将来私はXNAに移動するリプレイmybeeをありがとう。 – samy

答えて

7

あなたは、あなたがそれを押したときにキーを繰り返しキーボードコントローラに依存しています。別のキーを押すと、動作が停止します。これには異なるアプローチが必要です。

まず、NotMoving、MovingLeft、およびMovingRightのような値を持つ宇宙船のモーション状態を示す列挙体が必要です。その型の変数をクラスに追加します。 KeyDown KeyUpイベントの両方が必要です。例えば、Keys.LeftのKeyDownを取得したら、変数を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.. 
    } 
関連する問題