2011-04-09 69 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