2013-02-23 49 views
1

代码检测按键:使用定时器

private void sprites_updater_Tick(object sender, EventArgs e) 
    { 
     s++; 
     int x = player.Location.X; 
     int y = player.Location.Y; 
     if (s == 1) 
     if (ModifierKeys.HasFlag(Keys.A)) 
      { 
       player.Location = new Point(x - 5, y); 
      } 
      s = 0; 
      sprites_updater.Start(); 

     } 

所以在使用定时器的代码,我写上面同样的事情(ModifierKeys.HasFlag(Keys.A)),但它didn't工作。为什么?! 顺便说一句,有没有什么办法可以在不使用XNA,WPF或其他任何东西(仅限于.NET)的情况下在WinForms面板中显示3D摄像头视角?

回答

1

让键盘敲击的最佳方式及其之后的处理它们是同时使用的KeyDown,KEYUP和标志赶上形式的键盘事件:

bool isAPressed; 
... 

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    switch(e.KeyCode) 
    { 
     case Key.A: 
      isAPressed = true; 
      break; 
     case Key.XXXX: 
      ... 
    } 
} 

private void Form1_KeyUp(object sender, KeyEventArgs e) 
{ 
    switch(e.KeyCode) 
    { 
     case Key.A: 
      isAPressed = false; 
      break; 
     case Key.XXXX: 
      ... 
    } 
} 

然后你可以使用你的计时器这样的信息:

private void sprites_updater_Tick(object sender, EventArgs e) 
{ 
    s++; 
    int x = player.Location.X; 
    int y = player.Location.Y; 
    if (s == 1) 
    if (isAPressed) 
     { 
      player.Location = new Point(x - 5, y); 
     } 
     s = 0; 
     sprites_updater.Start(); 
    } 

这是处理玩家移动这种方式(箭头)特别interresting。

+0

System.EventArg不包含KeyCode的定义。 – 2013-02-23 22:28:51

+0

它仍然说,System.EventArgs没有定义KeyCode – 2013-02-23 22:31:30

+1

你是对的;我无法从Timer事件中获取KeyCode。这就是为什么我建议从KeyUp和KeyDown事件中的System.KeyEventArgs中获取它。 – Larry 2013-02-23 22:31:44