2011-04-09 64 views
0

我想在键盘上的每个键击发生时创建一个事件。到目前为止,我这样做:在键盘上创建事件

namespace WindowsFormsApplication1 
{ 
    public partial class SpaceInvadors : Form 
    { 

    SpaceInvadors sInvaders; 
    public SpaceInvadors() 
    { 
     InitializeComponent(); 
     KeyStroke keyStroke = new KeyStroke(); 
     sInvaders=new SpaceInvadors(keyStroke); 
    } 

    public SpaceInvadors(KeyStroke keyStroke) 
    { 
     keyStroke.keyStroked += Form1_KeyDown;//How does that chaining to the event work? 
     keyStroke.keyStroked += Form1_KeyUp; 
    } 

    private void Form1_KeyDown(object sender, KeyArgs e) 
    { 
     if (e.KeyCode == Keys.Q) 
     { 
     Application.Exit(); 
     } 
    } 
    } 
    public class KeyStroke 
    { 
    public event EventHandler<KeyArgs> keyStroked; 
    public void Add(Keys key) 
    { 
     // I need to know how to obtain this key: 
     KeyArgs keyAr = new KeyArgs(key); 
     keyRisen(keyAr); 
    } 

    public void keyRisen(KeyArgs kA) 
    { 
     if (keyStroked != null) 
      keyStroked(this, kA); 
    } 
} 

public class KeyArgs : EventArgs 
{ 
    public Keys KeyCode { get; set; } 
    public KeyArgs(Keys key) 
    { 
     KeyCode = key; 
    } 
} 

另外,我怎么能所有的时间听取被按下了哪个键,而不是只有一次

回答

3

对于你的问题

“此外,如何能我所有的时间听 什么是按键,不仅 一次”

我看到你已经使用Form.KeyDo WN事件关闭您的游戏,如果“Q”被压:

private void Form1_KeyDown(object sender, KeyArgs e) 
     { 
      if (e.KeyCode == Keys.Q) 
      { 
      Application.Exit(); 
      } 
} 

好吧,你可以添加多个键,你的方法:

private void Form1_KeyDown(object sender, KeyArgs e) 
    { 
     if (e.KeyCode == Keys.Q) 
     { 
     Application.Exit(); 
     } 
     else if (e.KeyCode == Keys.Up) 
     spaceInvaders.MoveUp(); 
    } 

对于链接,我认为类KeyStoke管理播放界面。因为KeyDown事件用于确定按下了哪个键。我建议你更多地学习活动和代表。

+0

它显示下方keyDownEventArgs E中的线。说我错过了集会?!? – 2011-04-09 18:20:04

+0

我实现了你的代码,并删除了我的..但它显示在KeyDownEventArgs下面的蓝线...说我缺少一个参考,我是否需要添加一些使用.. :( – 2011-04-09 18:25:29

+1

每当你缺少一个参考,谷歌确切的类和方法/属性,你会得到命名空间的层次结构,这将有助于你得到正确的引用和导入语句。例如,如果谷歌“形式KeyDownEventArgs”我发现第三谷歌条目是“KeyEventArgs类(系统。 Windows.Forms“(http://msdn.microsoft.com/en-us/library/system.windows.forms.keyeventargs.aspx)。 – richard 2011-04-09 18:28:34

0

如果我明白你正在写游戏,太空入侵者! :)
我不认为这种方法对游戏有好处。最合适和最常用的方法是使用GetKeyboardState函数。为了使用此功能获得良好的游戏结果,应定期创建计时器并检查键状态。而且我建议你在定时器例程中执行渲染。

如果某些原因阻止你使用GetKeyboardState我会建议更换你使用PreviewKeyDown

+0

他给了我一个答案...唷..我想我必须自己写一切 – 2011-04-09 18:29:02