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.KeyPreviewtrue.

从上面的链接中,msdn 谈到了这一点:

如果表单将接收所有关键事件,则为 true;如果窗体上当前选定的控件接收到键事件,则返回 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 回答