我有一个WinForms程序,当我按下Up,Down,Left和Right时,我有一个动画对象移动。对象的移动在计时器内动画,每隔30毫秒调用一次。计时器在KeyDown事件上启动,并在KeyUp事件上停止。
所以,如果我举行例如左,然后我立即释放左键并按下另一个键后,在它朝那个方向移动之前会有一点暂停(大约半秒钟)。 这个问题没有出现,如果我向左,释放它,等待一点,然后按向右。在这种情况下,它会立即向右移动。 如果我向左按住,然后开始向右按住,而我仍然向左握住,也不会出现。在这种情况下,它也会立即开始向右移动。 问题只会出现,当我松开钥匙并立即按下另一个钥匙时。
KeyDown事件:
private void form_KeyDown(object sender, KeyEventArgs e)
{
k = 0;
watch.Start();
if (e.KeyCode == Keys.Left)
{
direction = MOVE_LEFT;
}
else if (e.KeyCode == Keys.Right)
{
direction = MOVE_RIGHT;
}
else if (e.KeyCode == Keys.Up)
{
direction = MOVE_UP;
}
else if (e.KeyCode == Keys.Down)
{
direction = MOVE_DOWN;
}
timerMove.Start();
}
KeyUp事件:
private void form_KeyUp(object sender, KeyEventArgs e)
{
timerMove.Stop();
}
计时器事件(动画移动)
void charMovement(object sender, System.Timers.ElapsedEventArgs e)
{
if (direction == MOVE_LEFT)
{
timerMove.Interval = 30;
CharSize(11, 15); //mainChar.Size = new System.Drawing.Size(11, 15);
//code for movement
}
else if (direction == MOVE_RIGHT) //... etc. etc.
答案 0 :(得分:1)
问题不在于计时器,而在于键盘的重复暂停设置。如果按住某个键,则第一个和第二个字母之间会有一个暂停。然后在以下字母之间停留更长时间。这就是你所看到的。
您可以忘记键盘事件并使用单个心跳计时器,检查按下了哪些键然后对其进行操作。似乎WinForms没有类似GetKeySate的内容,但您可以P/Invoke the win32运行。
或者您可以滚动自己的GetKeyState版本并记住在KeyDown中按下哪些键并重置KeyUp中的标志。只要按下至少一个键,移动计时器就会一直运行。
答案 1 :(得分:0)
如果你还没有这样做,试试这个
FormName.KeyPreview = true;
另外,只使用一种方法..而不是两种..趋势是按键会被读取两次,因为有一个向上和向下...尝试使用KeyPreview = true; 然后使用KeyPress而不是KeyDown和KeyUp