0

さて、私の最後の質問は物事について本当に明確ではなかったので、私はそれを削除してこれを作りました。私はゲーム「ヘビ」を作っています。私が欲しいのは、難易度を選択した後、フォームのキーダウンが機能する必要があることです(難易度を選択すると、ヘビが描画されて動き始めます。希望の方向に移動するには、矢印キーを押します)難しさを追加する前は、完全に機能していました。難易度を選択してゲームをプレイしたいのですが、ヘビが動かず、プログラムでキーが反応しません。

だから私の問題=難易度を選択した後にkeyDownが機能しない。

private void btnNormal_Click(object sender, EventArgs e)
{
  timer1.Interval = 250;
  btnNormal.Visible = false;
  btnEasy.Visible = false;
  btnHard.Visible = false;
  diffLabel.Visible = false;
  timer1.Enabled = true;
  down = false;
  up = false;
  right = true;
  left = false;

}

private void btnHard_Click(object sender, EventArgs e)
{
  timer1.Interval = 10;
  btnNormal.Visible = false;
  btnEasy.Visible = false;
  btnHard.Visible = false;
  diffLabel.Visible = false;
  timer1.Enabled = true;
  down = false;
  up = false;
  right = true;
  left = false;
}

private void btnEasy_Click(object sender, EventArgs e)
{
  timer1.Interval = 500;
  btnNormal.Visible = false;
  btnEasy.Visible = false;
  btnHard.Visible = false;
  diffLabel.Visible = false;
  timer1.Enabled = true;
  down = false;
  up = false;
  right = true;
  left = false;
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{

  if (e.KeyData == Keys.Down && up == false)
  {
    down = true;
    right = false;
    up = false;
    left = false;
  }

  if (e.KeyData == Keys.Up && down == false)
  {
    down = false;
    right = false;
    up = true;
    left = false;
  }

  if (e.KeyData == Keys.Right && left == false)
  {
    down = false;
    right = true;
    up = false;
    left = false;
  }

  if (e.KeyData == Keys.Left && right == false)
  {
    down = false;
    right = false;
    up = false;
    left = true;
  }
}
4

2 に答える 2

1

プロパティFrom.KeyPreviewをに設定してみてくださいtrue

上記のリンクから、msdnはこれについて述べています:

フォームがすべての主要なイベントを受け取る場合はtrue。フォームで現在選択されているコントロールがキーイベントを受信した場合はfalse。デフォルトはfalseです。

このプロパティがtrueに設定されている場合、フォームはすべてのKeyPress、KeyDown、およびKeyUpイベントを受け取ります。フォームのイベントハンドラーがキーストロークの処理を完了すると、キーストロークがフォーカスのあるコントロールに割り当てられます。たとえば、KeyPreviewプロパティがtrueに設定されていて、現在選択されているコントロールがTextBoxである場合、キーストロークがフォームのイベントハンドラーによって処理された後、TextBoxコントロールは押されたキーを受け取ります。

要するに、あなたの問題はフォーカスの問題でした。KeyDownイベントを受信するコントロールには、フォーカスがない可能性があります。そのため、イベントを受信するコントロールがフォーカスされているかどうかに関係なく、常にKeyDownイベントを受信するようにフォームを強制します。

于 2012-10-22T20:25:56.450 に答える
1

それをテストするためのすべてのコードがなければ、判断を下すのは難しいです...

ただし、フォームにボタンを追加したと思います。この場合、ボタンにまだフォーカスがある場合、KeyDownイベントはフォームではなく、ボタンに送信されます。

Form1_KeyDownメソッドをOnKeyDownベースメソッドのオーバーライドに変換し、コンストラクターでPreviewKeysをtrueに設定します。

public MyForm()
{
    InitializeComponent();
    KeyPreview = true;
}

protected override void OnKeyDown(KeyEventArgs e)
{
    // Insert key presses logic
    base.OnKeyDown(e);
}
于 2012-10-22T20:27:07.767 に答える