Pregunta

Tengo un lienzo de 800x600 dentro de una ventana de 300x300. Cuando presiono una tecla determinada, quiero que el lienzo se mueva en esa dirección.
He hecho esto dentro del código de la ventana detrás:

protected override void OnKeyDown(KeyEventArgs e)
{
    base.OnKeyDown(e);
    Key keyPressed = e.Key;

    if (keyPressed == Key.W)
    {
        gcY += 5;
    }
    if (keyPressed == Key.S)
    {
        gcY -= 5;
    }
    if (keyPressed == Key.A)
    {
        gcX += 5;
    }
    if (keyPressed == Key.D)
    {
        gcX -= 5;
    }

    gameCanvas.RenderTransform = new TranslateTransform(gcX, gcY);
}

Bueno, funciona, pero el movimiento es desigual. Y si me aferro a una tecla, W por ejemplo, entonces se detiene por una fracción de segundo, antes de moverse.
¿Hay alguna forma de suavizar el movimiento y deshacerse de la pausa cuando mantiene presionada una tecla?
Gracias.

¿Fue útil?

Solución

Actualmente, su configuración está aceptando la entrada de clave con correo no deseado (manteniendo presionada una tecla). La forma en que lo he visto hacer en la mayoría de los juegos con entrada basada en eventos es usar una matriz booleana, keydown [256] , mapeando el teclado (el índice es el valor clave); todos los valores inicializados a false .

Cuando se presiona la tecla, establece el índice apropiado en true en el método keydown y en su ciclo de juego / representación, llama a gameCanvas.RenderTransform = new TranslateTransform (gcX, gcY); dependiendo de qué claves de la matriz son true . Establece el valor de clave en false cuando la clave se libera en el método de evento de liberación de clave (no estoy seguro de qué es en C #).

De esta forma, obtendrá un desplazamiento suave y no se retrasará el inicio.

Otros consejos

Sí, podría incorporar el tiempo en su cálculo. Actualmente agrega / resta 5 cada vez que se dispara el evento, y eso no es realmente predecible.

Para suavizar el movimiento, asegúrate de no disparar más de X veces por segundo utilizando DateTime.

como:

private static DateTime nextUpdate

if (nextUpdate <= DateTime.Now)
{
//Move
nextUpdate = DateTime.Now.AddMilliseconds(100);
}

No tengo VS en este momento, así que no estoy completamente seguro de la sintaxis, pero entiendes la idea.

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