拿着箭头键为字符运动C#.Net ISSUES

所以简而言之,我只是想在WPF应用程序中围绕Canvas对象移动一个矩形。 我这里有我的KeyDown事件function。 问题是,当我长按一个键时,它会反复快速启动此function并拧紧我的矩形位置代码。

我背后的理论/逻辑:因为当你把键盘按在键盘上时它没有顺利移动(在浏览器的滚动条上测试,它开始,暂停,然后继续下去),我想要它开始一个表格在UI中移动对象的计时器。 然后当KeyUp事件发生时,计时器STOPS。

public void Window_KeyDown(object sender, KeyEventArgs e) { string msg; string keystr = e.Key.ToString(); Key keyval = e.Key; switch (keystr) { case "Down": Console.WriteLine("Case 1"); Display.Content = "Down"; foreach (Character character in creatures) { //character.buttondown = true; character.Position("Down"); } break; case "Up": Console.WriteLine("Case 2"); Display.Content = "Up"; foreach (Character character in creatures) { //character.buttondown = true; character.Position("Up"); } break; case "Left": Console.WriteLine("Case 3"); Display.Content = "Left"; foreach (Character character in creatures) { //character.buttondown = true; character.Position("Left"); } break; case "Right": Display.Content = "Right"; foreach (Character character in creatures) { //character.buttondown = true; character.Position("Right"); } break; } } public void Window_KeyUp(object sender, KeyEventArgs e) { Display.Content = "No key is pressed."; foreach (Character character in creatures) { if (e.Key == Key.Right) { character.StopIt(); } if (e.Key == Key.Left) { character.StopIt(); } if (e.Key == Key.Up) { character.StopIt(); } if (e.Key == Key.Down) { character.StopIt(); } } } 

如果你需要我的矩形类代码,我只会发布如果按下右箭头键会发生什么:

  1. 职位被称为

     public void Position(String Direction) { if (Direction == "Right") { tmr = new System.Windows.Forms.Timer(); tmr.Interval = this.waitTime; tmr.Tick += new EventHandler(GoRight); tmr.Start(); } } 
  2. GoRight被称为:

     public void GoRight(object sender, System.EventArgs e) { if (x  Background.ActualWidth - CharacterWidth) { goRight = false; tmr.Stop(); } } } 

最后,在KeyUp事件中调用StopIt:

 public void StopIt() { tmr.Stop(); goRight = true; goLeft = true; goUp = true; goDown = true; } 

我现在只学习了几个月的c#所以我试图保持它相对简单,如果可能的话,只使用.net。

任何帮助,将不胜感激!!

编辑:: 我的解决方案:

我只是在我的开关盒周围做了一个while(flag)循环。 然后我在案例中设置了flag = false。 按下Key UP时,我再次将flag设置为true。 好极了

我假设您希望角色在初始KeyDown事件上移动。 然后,在获得KeyUp事件之前,您希望忽略任何后续的KeyDown事件。

因此,您可以通过检查e.IsRepeat来忽略后续的KeyDown事件,例如

 public void Window_KeyDown(object sender, KeyEventArgs e) { if (e.IsRepeat) return; // rest of your code... 

顺便说一下,滚动应用程序时观察到的非平滑运动是由键盘重复延迟引起的。 您可以在键盘属性中设置此项,或者通过http://msdn.microsoft.com/en-us/library/system.windows.systemparameters.keyboarddelay.aspx进行设置。

我不太了解WPF告诉你发生了什么,尽管你可能对按钮/暂停的事情是正确的。 这取决于WPF如何处理按键。 我的猜测是,它与大多数Microsoftforms的工作方式相同; 它有一个停顿,可以防止你一次输入多个字符。 可能有办法解决这个问题,但我不确定。

我要说的是你应该使用专为游戏设计的东西。 当我第一次尝试创建游戏时,我这样做的风格与你正在做的类似,但它不起作用。 您使用的是专为办公软件设计的,无法访问您所需的内容; 至少不是没有战斗和变通办法。 正如Alex Beisley对XNA所建议的那样。 不幸的是,这是一种死语,但它最近才消失。 它使用的是c#,由微软制造,并且function强大,足以在不打击你的情况下做你想做的事情,并且一旦掌握了它就很容易使用。 看到它被杀掉是一种耻辱。

如果你想折磨自己,那么我建议你去尝试学习C ++和DirectX的路线。 这并不容易,你需要耐心等待并经历多个教程(没有一个教程似乎可以很好地解释任何事情)。 DirectX和C ++不会很快出现,所以如果你想要进入长期语言,它们是一个安全的选择。