我是一名初学者程序员,我正在尝试使用户能够使用WASD移动标签,但是它似乎不起作用,我已经潜入互联网寻求答案,毫无希望。为了记录,我使用的是Microsoft Visual Studio 2012。
这是用户密钥检测方法
internal class Input
{
private static Hashtable keyTable = new Hashtable();
public static bool KeyPressed(Keys key)
{
if (keyTable[key] == null)
return false;
return (bool)keyTable[key];
}
public static void ChangeState(Keys key, bool state)
{
keyTable[key] = state;
}
}
以及用于在按键上实际移动东西的代码
private void moveObject(object sender, EventArgs e)
{
{
if (Input.KeyPressed(Keys.A))
{
label1.Location = new Point(label1.Location.X - 1, label1.Location.Y);
MessageBox.Show("test", "test");
}
if (Input.KeyPressed(Keys.D))
{
label1.Location = new Point(label1.Location.X +1, label1.Location.Y);
}
if (Input.KeyPressed(Keys.S))
{
label1.Location = new Point(label1.Location.X, label1.Location.Y-1);
}
if (Input.KeyPressed(Keys.W))
{
label1.Location = new Point(label1.Location.X, label1.Location.Y+1) ;
}
}
在我看来,它应该可以在纸上工作,但是它什么也没做。
答案 0 :(得分:1)
您可以右键单击moveObject方法并找到所有引用,这将帮助您找到此方法“处理”哪个事件。另外,您还可以在该方法中添加一个断点并执行“事件”,以查看是否实际调用了此方法。
答案 1 :(得分:0)
此答案假定您正在使用WinForms。
为什么不只使用内置事件?对于Form
类,有一个KeyDown
事件。然后,您可以使用KeyEventArgs
类的KeyCode
属性,该属性返回已按下的键。
现在您已经按下了什么键,请使用开关/大小写框来根据所按下的键分开操作。 (请记住,每个case块都必须以break;
语句结尾。)每个case的参数都将针对switch参数进行测试。如果它们相同,则将运行给定的case块。否则,将跳过该案例块。例如,如果您按下“ A”按钮,则仅运行case Keys.A
块。
然后使用Label的Top
和Left
属性来移动Label。
例如如果按W,则它应向上移动1个像素,这意味着Top
属性应减少1。(Top
是Label与窗口顶部之间的距离,Left
是它到左边的距离。)
private void Form_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
switch (e.KeyCode) {
case Keys.W: {
label1.Top -= 1;
break;
}
case Keys.A: { //do stuff on A button }
case Keys.S: { //do stuff on S button }
case Keys.D: { //do stuff on D button }
default: { break; }
}
}