我想在键盘上的每个键击发生时创建一个事件。到目前为止,我做到了这一点:
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;
}
}
此外,我怎样才能一直听到按键的内容,而不仅仅是一次
答案 0 :(得分:3)
对于你的问题
“另外,我怎么能一直听 什么键被按下,而不是 只有一次“
我看到你已经使用Form.KeyDown事件关闭你的游戏,如果按下'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事件用于确定按下了哪个键。我建议你更多地了解活动和代表。
答案 1 :(得分:0)
如果我理解你正在写游戏,太空入侵者! :)
我不认为这种方法对游戏有好处。最合适和最常用的方法是使用GetKeyboardState函数。要使用此功能获得良好的游戏结果,您应该定期创建计时器并检查关键状态。我建议您在计时器例程中执行渲染。
如果某些原因阻止您使用GetKeyboardState
,我会建议您使用PreviewKeyDown