2017-12-26 11 views
4

Visual Studio Windowsフォームアプリケーションを使用してC#で簡単なゲームを作成しようとしています。私は、ユーザーが対応するキーを使用して、青いボックスを上方向、右方向、下方向、左方向に自由に動かせるようにします。KeyDownイベントを使用してスムーズにコントロールを移動する

私は、ボックスの新しい場所を0.1秒ごとに検出するタイマと、実際にボックスの位置を変更するkeydownイベントを使用しています。 キーを押したままボックスを対応する方向に動かし続ける必要があります。

私の問題は、私の現在のプログラムは、ユーザーが最初にキーを押すと、ボックスが少し動いて、動きが止まる前に一時停止することを除いて、仕事をします。私は、このボックスを、最初のキーを押すことから、そのように一時停止することなく、よりスムーズに動かしたいと思っています。これは言葉で説明するのが難しいかもしれないので、私はgifファイルを追加しました。

enter image description here

この問題を解決する方法はありますか?ここに私の現在のコードです。

private int posX, posY; //Both initialized in Form Load event 

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Up) 
     posY -= 3; 
    else if (e.KeyCode == Keys.Right) 
     posX += 3; 
    else if (e.KeyCode == Keys.Down) 
     posY += 3; 
    else if (e.KeyCode == Keys.Left) 
     posX -= 3; 
} 

//Timer ticks every 0.1 second 
private void Timer_Tick(object sender, EventArgs e) 
{ 
    Box.Location = new Point(posX, posY); 
    labelPosX.Text = posX.ToString(); //Testing purposes 
    labelPosY.Text = posY.ToString(); //Testing purposes 
} 

私はこれを達成するために、KeyDownイベントを使用するのが大好きだが、実際に本物のゲームの世界で使用される、より良い以上の一般的な方法があれば、私もそれについて知っているのが大好きです!

答えて

4

Timer_TickメソッドでKeyboard.IsKeyDownメソッドを使用し、keydownイベントを待機しません。そのよう

double posX, posY; 

private void Timer_Tick(object sender, EventArgs e) 
{ 
    double velocity = /*(speed: pixels per seconds)*/ 100 * /*(timer tick time in seconds)*/ 0.003; 

    if (Keyboard.IsKeyDown(Keys.Up)) 
    { 
     posY -= velocity; 
    } 
    else if (Keyboard.IsKeyDown(Keys.Down)) 
    { 
     posY += velocity; 
    } 
    //Also, don't put else here, so you can go diagonally. 
    if (Keyboard.IsKeyDown(Keys.Left)) 
    { 
     posX -= velocity; 
    } 
    else if (Keyboard.IsKeyDown(Keys.Right)) 
    { 
     posX += velocity; 
    } 

    Box.Location = new Point((int)posX, (int)posY); 
    labelPosX.Text = posX.ToString(); //Testing purposes 
    labelPosY.Text = posY.ToString(); //Testing purposes 
} 

public static class Keyboard 
{ 
    private static readonly HashSet<Keys> keys = new HashSet<Keys>(); 

    public static void OnKeyDown(object sender, KeyEventArgs e) 
    { 
     if (keys.Contains(e.KeyCode) == false) 
     { 
      keys.Add(e.KeyCode); 
     } 
    } 

    public static void OnKeyUp(object sender, KeyEventArgs e) 
    { 
     if (keys.Contains(e.KeyCode)) 
     { 
      keys.Remove(e.KeyCode); 
     } 
    } 

    public static bool IsKeyDown(Keys key) 
    { 
     return keys.Contains(key); 
    } 
} 

とキーボードクラスを使用するには、InitializeComponent方法でForm1のKeyDownイベントとkeyUpイベントイベントを設定します。

KeyDown += Keyboard.OnKeyDown; 
KeyUp += Keyboard.OnKeyUp; 

速度を変更することで速度を制御できます。

+0

ありがとうございます! .dllファイルなどをインストールする必要がありますか?私のVisual Studioは 'キーボード 'を認識しません。 「Using System.Windows.Input;」を追加しました。それでもそれは認識できません。=/ –

+0

Hm。 FormsにはKeyboardクラスがないことを忘れていました。あなたに答えを編集させてください。 – rokkerboci

+0

ありがとう、私はキーボードクラスもWPF用だと思っていました。 –

関連する問題