1

私は単純なゲームを作成しており、次のコードを使用してカーソル キーを検出します。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (Connection == null || Connection.IsOpen == false)
        return true;

    Thread.Sleep(SleepTime);

    switch (keyData)
    {
        case Keys.Up:
            GoForward();
            return true;

        case Keys.Right:
            GoRight();
            return true;

        case Keys.Left:
            GoLeft();
            return true;

        case Keys.Down:
            GoBackward();
            return true;

        case Keys.Space:
            Beep();
            return true;
    }

    return base.ProcessCmdKey(ref msg, keyData);
}

また、このコードを使用して、ユーザーが以前に押したキーを離したかどうかを判断します。

private void MainForm_KeyUp(object sender, KeyEventArgs e)
{
    StopRoomba();
}

現在、2 つの問題があります。ユーザーがたとえば UP カーソルと RIGHT カーソルを同時に押すことができる状況を追加して、キャラクターが右上に移動するようにしたいと考えています。コードでこの状態を確認するにはどうすればよいですか?

また、奇妙なことが起こります(または、デフォルトのシステムかもしれません)。一度に 3 つのカーソル キーを押すことができます。たとえば、UP キーを押しながら RIGHT キーを押しながら、UP キーと RIGHT キーを押しながら DOWN キーを押したままにすると、コードは 3 つのコードすべてに反応します。下の図では、赤い方向が押されており、私のコードによって検出されていることがわかります (赤 = 押された):

ここに画像の説明を入力

私の 2 番目の問題は、 がキー リリースを検出しないMainForm_KeyUp ことがあり、キャラクターがその方向に進み続けることです。

ヒント/ヘルプは感謝されます

4

1 に答える 1

2

Keys は、フラグ付きの列挙型です。つまり、ビットごとの比較を使用して、複数のキーが同時に押されているかどうかを確認できます。

case Keys.Up & Keys.Right:
    ...
    break;

次のようなチェックを使用して、個々のキーを確認することもできます。

if ((keyData & Keys.Up) == Keys.Up) 
    GoForward();
if ((keyData & Keys.Right) == Keys.Right) 
    GoRight();
于 2012-12-20T02:17:59.327 に答える