3

シンプルな WinForm カーレース ゲームを作成しています。車という 2 つのオブジェクトがあり、キーが押されるとフォーム上を移動します (Form1KeyDown_Event)。

唯一のことは、一方のプレーヤーがキーを押すと、もう一方のプレーヤーは自分のキーを押すことができないということです (何も起こりません)。しかし、最初のプレーヤーがキーを放すと、2 番目のプレーヤーは自分のキーの 1 つを押して、通常どおり自分の車を制御できます。

2 つのプレーヤー キーを同時にリッスンするにはどうすればよいですか? スレッドを使用して、各車を独自のスレッドに配置する必要がありますか?

4

2 に答える 2

3

代わりに keyup および keydown イベントを使用して、同時に複数のキーをリッスンするためにできることの簡単な例を次に示します。

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WinFormTest {
    public partial class Form1 : Form {
        private readonly IDictionary<Keys, bool> downState;

        public Form1() {
            InitializeComponent();
            downState = new Dictionary<Keys, bool>();
            downState.Add(Keys.W, false);
            downState.Add(Keys.D, false);

            KeyDown += remember;
            KeyUp += forget;
        }

        protected override void OnLoad(EventArgs e) {
            base.OnLoad(e);
            Timer timer = new Timer() { Interval = 100 };
            timer.Tick += updateGUI;
            timer.Start();
        }

        private void remember(object sender, KeyEventArgs e) {
            downState[e.KeyCode] = true;
        }

        private void forget(object sender, KeyEventArgs e) {
            downState[e.KeyCode] = false;
        }

        private void updateGUI(object sender, EventArgs e) {
            label1.Text = downState[Keys.W] ? "Forward" : "-";
            label2.Text = downState[Keys.D] ? "Right" : "-";
        }
    }
}
于 2013-05-25T01:36:19.567 に答える