2010-11-28 5 views
1

WinFormsプログラムがあります。ここでは、上、下、左、右を押すと移動する特定のアニメーションオブジェクトがあります。オブジェクトの動きは30msごとに呼ばれるタイマーの中でアニメーション化されます。タイマーはKeyDownイベントで開始し、KeyUpイベントで停止します。System.Timers.Timer別のキーがリリースされた後に起動する問題

したがって、たとえば左を押したまま、左のキーを放して別のキーを押した直後に、その方向に移動する前にわずかな休止(約0.5秒)があります。 その問題は表示されません、もし私が左を保持すると、それをリリースし、少し待ってください。 then右を押してください。そのような場合は、すぐに右に移動します。 私はまだ左を保持している間、私は左を押しているし、右を押し続けている場合、それも表示されません。その場合、すぐに右に動き始めるでしょう。 問題は、キーを離してすぐに別のキーを押すと表示されます。

KeyDownイベント:

private void form_KeyDown(object sender, KeyEventArgs e) 
    { 
     k = 0; 
     watch.Start(); 

     if (e.KeyCode == Keys.Left) 
     { 
      direction = MOVE_LEFT; 
     } 
     else if (e.KeyCode == Keys.Right) 
     { 
      direction = MOVE_RIGHT; 
     } 
     else if (e.KeyCode == Keys.Up) 
     { 
      direction = MOVE_UP; 
     } 
     else if (e.KeyCode == Keys.Down) 
     { 
      direction = MOVE_DOWN; 
     } 
     timerMove.Start(); 
    } 

KeyUpイベント:

private void form_KeyUp(object sender, KeyEventArgs e) 
    { 
     timerMove.Stop(); 
    } 

Timerイベント(アニメーションの動き)

void charMovement(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     if (direction == MOVE_LEFT) 
     { 
       timerMove.Interval = 30; 
       CharSize(11, 15); //mainChar.Size = new System.Drawing.Size(11, 15); 
       //code for movement 

     } 
     else if (direction == MOVE_RIGHT) //... etc. etc. 
+1

WinFormsアプリケーションでは、System.Timers.Timerではなく、System.Windows.Forms.Timerを使用する必要があります。どのようにあなたのアニメーションを台無しにするのですか? – SLaks

+0

私のアニメーションが壊れてしまいますので使用できません。私はすでにそれを試してみましたが、stackoverflowの人々は代わりにTimers.Timerを使用するように私に言った。少なくとも私のアニメーションはうまくいきました。唯一の問題は、私が上に述べた問題です。 – NoelAramis

+0

どのようにアニメーションを台無しにするのですか? – SLaks

答えて

1

問題はタイマーではなく、キーボードの繰り返しの一時停止の設定です。キーを押したままにすると、最初の文字と2番目の文字の間に一時停止があります。次の文字の間隔を長くします。それはあなたが見るものです。

キーボードのイベントを忘れて、1つのハートビートタイマーを使用して、どのキーが押されているかを確認してからそれに対処することができます。 WinFormsにはGetKeySateのようなものはないようですが、P/Invoke the win32の機能があります。

あなた自身のバージョンのGetKeyStateをロールし、KeyDownのどのキーが押されたかを覚えておき、KeyUpのフラグをリセットすることができます。移動タイマーは、少なくとも1つのキーが押されている間は動作し続けます。

+0

ありがとう、私はそれを試して、それは動作します! – NoelAramis

0

を試してみてくださいやってあなたがまだそれをしていない場合これはまだ

FormName.KeyPreview = true;

また、1つだけの方法を使用してください。2つではありません。キーアップは2回読み取られます。これは、上下があるためです。KeyPreview = trueを使用してみてください。 KeyDownとKeyUpの代わりにKeyPressを使用

+0

私はすでにそれを試みました。基本的に、プログラムは矢印キーを押したことを知りませんでしたので、インターネット上で見つかった方法を上書きしようとしました。矢印キーが押されたかどうかを調べることができましたが、作業。 – NoelAramis

+0

なぜあなたはSystem.Windows.Forms.Timerを使用しませんか..それはあなたのアニメーションのためにも働きます...それをいつ止めるかを必ず確かめてください... –

+0

私はそれを使っていますが、それはまったく同じです。私はプログラムの振る舞いに何の変化も見ませんでした。 – NoelAramis

関連する問題