Pregunta

Tengo un programa de Windows Forms, donde tengo un objeto animado seguro que se mueve en torno al pulsar arriba, abajo, izquierda y derecha. El movimiento del objeto se anima el interior de un temporizador, que se llama cada 30 ms. El temporizador se inicia en el evento KeyDown, y se detiene en el evento KeyUp.

Por lo tanto, si mantengo, por ejemplo, a la izquierda, y luego inmediatamente después de que suelte la tecla izquierda y pulse otra, hay una pequeña pausa (aproximadamente medio segundo), antes de que se mueve en esa dirección. Ese problema no aparece, si soltar hacia la izquierda, la liberación, y esperar un poco, y después de prensa derecha. En tal caso, sería mover inmediatamente a la derecha. También no aparece si tengo en la mano izquierda hacia abajo, y luego iniciar la celebración de abajo a la derecha, mientras yo todavía estoy sosteniendo fui. En ese caso, sería comenzar a moverse a la derecha inmediatamente, también. El problema aparece sólo, cuando suelte la tecla e inmediatamente pulse otra después.

evento 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();
    }

evento KeyUp:

private void form_KeyUp(object sender, KeyEventArgs e)
    {
        timerMove.Stop();
    }

evento Timer (movimiento animación)

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.
¿Fue útil?

Solución

El problema no son los contadores de tiempo, pero el ajuste de pausa de repetición del teclado. Si se mantiene pulsado una tecla, hay una pausa entre la primera y la segunda letra. Una pausa más larga entonces entre las siguientes letras. Eso es lo que se ve.

Se podría olvidarse de los eventos de teclado y utilizar un solo temporizador de latidos del corazón, comprobar lo que se pulsan las teclas y luego actuar en consecuencia. Parece WinForms no tiene algo así como GetKeySate , pero se puede P / Invoke la función Win32 .

O se podría rodar su propia versión de GetKeyState y recordar lo que las claves son prensas en KeyDown y restablecer el indicador en KeyUp. El temporizador de movimiento sigue funcionando siempre y cuando se presiona al menos una clave.

Otros consejos

trate de hacer esto si no lo ha hecho todavía

FormName.KeyPreview = true;

También, sólo utilizan un método no .. dos .. tendencia es la pulsación de tecla se lee dos veces ya que no hay un arriba y un abajo ... intente utilizar TeclaDePresentaciónPreliminar = true; a continuación, utilizar KeyPress en lugar de KeyDown y KeyUp

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top