c# - C#キーを押すとオブジェクトの動きが壊れる

原文 c# key game-physics keydown

ピンポンゲームを作成しています。移動のためのキーが押された場合、両方の線(画像ボックス)を同時に移動することができました。問題は、1人のプレーヤーのコントロールが押し下げられてから、他のプレーヤーが(1回だけ)クリックすると、他のプレーヤーの動きが中断されるため、もう一度キーを押す必要があることです。 keypressKeyboard.IsKeyDownで修正しようとしましたが、うまくいきませんでした。

これが私のコードです:

public void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        Keys up1 = (Keys)Enum.Parse(typeof(Keys), form1.p5_text_kontrole_gor1.Text , true);
        Keys down1 = (Keys)Enum.Parse(typeof(Keys), form1.p5_text_kontrole_dol1.Text , true);

        Keys up2 = (Keys)Enum.Parse(typeof(Keys), form1.p5_text_kontrole_gor2.Text, true);
        Keys down2 = (Keys)Enum.Parse(typeof(Keys), form1.p5_text_kontrole_dol2.Text, true);

        if (e.KeyCode == Keys.Escape)
            Application.Exit();

        if(e.KeyCode == up1)
        {
            goup1 = true;
        }
        if (e.KeyCode == down1)
        {
            godown1 = true;
        }
        if (e.KeyCode == up2)
        {
            goup2 = true;
        }
        if (e.KeyCode == down2)
        {
            godown2 = true;
        }
        igra1();
    }

private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        Keys up1 = (Keys)Enum.Parse(typeof(Keys), form1.p5_text_kontrole_gor1.Text, true);
        Keys down1 = (Keys)Enum.Parse(typeof(Keys), form1.p5_text_kontrole_dol1.Text, true);

        Keys up2 = (Keys)Enum.Parse(typeof(Keys), form1.p5_text_kontrole_gor2.Text, true);
        Keys down2 = (Keys)Enum.Parse(typeof(Keys), form1.p5_text_kontrole_dol2.Text, true);

        if (e.KeyCode == up1)
        {
            goup1 = false;
        }
        if (e.KeyCode == down1)
        {
            godown1 = false;
        }

        if (e.KeyCode == up2)
        {
            goup2 = false;
        }
        if (e.KeyCode == down2)
        {
            godown2 = false;
        }
        igra1();
    }

public void igra1()
    {
        if (goup1)
        {
            if (form1.p6_ploscek1.Top > form1.panel6_pongIgra.Top)
                form1.p6_ploscek1.Top -= 15;
        }
        if (goup2)
        {
            if (form1.p6_ploscek2.Top > form1.panel6_pongIgra.Top)
                form1.p6_ploscek2.Top -= 15;
        }
        if (godown1)
        {
            if (form1.p6_ploscek1.Bottom < form1.panel6_pongIgra.Bottom)
                form1.p6_ploscek1.Top += 15;
        }
        if (godown2)
        {
            if (form1.p6_ploscek2.Bottom < form1.panel6_pongIgra.Bottom)
                form1.p6_ploscek2.Top += 15;
        }
    }
答え
ゲームのピースを動かすためにキーを押している間、キーがWindowsによって繰り返されるという事実に依存していると思います。代わりに押されている新しいキーが繰り返されるため、押されている最初のキーは繰り返しを停止します。

これを修正するには、TimerコントロールのTick()イベントでピースを移動します。 KeyDown / KeyUpイベントでは、関連付けられた部分が移動する必要があるかどうか(およびその方向)を表す変数の状態を変更するだけです。タイマーコードは状態変数を見て、それに応じて動作します...
関連記事

c# - ファイルが存在してもWebブラウザーのナビゲーションがキャンセルされました

c# - ユーザーのADからのオブジェクトGUID

c# - サービス時間を垣間見る方法

c# - log4net翌日の開始時にログファイルを上書きする

c# - ASP.NET MVC(部分的なビュー)を使用して同じページにレビュー製品(http投稿)を追加しようとしています

c# - Model3DCollectionとModel3DGroupの違いは何ですか?

java - 相互互換性のためにC#暗号化をJava(Android)暗号化に変換するヘルプ

c# - Mathos Parser-文字を演算子として使用する

c# - mvc scaffolding rawをデータベースから削除

c# - ASP.NET Webアプリケーションをビルドして起動し、Microsoft CodedUIテストを効率的で時間のかからない方法で実行します