1

我有一个 WinForms 程序,其中有一个动画对象,当我按向上、向下、向左和向右时,它会四处移动。对象的运动在一个计时器内进行动画处理,每 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.
4

2 回答 2

1

问题不是计时器,而是键盘的重复暂停设置。如果按住某个键,则第一个字母和第二个字母之间会有一个停顿。然后在以下字母之间停顿更长的时间。这就是你所看到的。

您可以忘记键盘事件并使用单个心跳计时器,检查按下了哪些键,然后对其进行操作。似乎 WinForms 没有GetKeySate 之类的东西,但您可以P/Invoke win32函数。

Or you could roll your own version of GetKeyState and remember what keys are presses in KeyDown and reset the flag in KeyUp. The move timer keeps running as long as at least one key is pressed.

于 2010-11-28T20:54:29.717 回答
0

如果您还没有这样做,请尝试这样做

FormName.KeyPreview = true;

另外,只使用一种方法..不是两种..趋势是按键会被读取两次,因为有一个向上和一个向下......尝试使用 KeyPreview = true; 然后使用 KeyPress 而不是 KeyDown 和 KeyUp

于 2010-11-28T19:41:45.643 回答