2012-09-05 11 views
14

Duplicar posible:
JavaScript move delay and multiple keystrokesCómo fijar retraso en Javascript keydown

Soy nuevo y aprender canvas de HTML5 junto con javascript. Creé un evento para mover un objeto a la izquierda y a la derecha, y mi problema es el retraso cada vez que mantienes presionada la tecla o cambias a otra tecla. Sé que falta mi código a continuación, por favor, ayúdenme. Gracias de antemano.

c.addEventListener('keydown',this.check,true); 
    function check(el) { 
    var code = el.keyCode || el.which; 
    if (code == 37 || code == 65){ 
    x -=1; 
    } 

    if (code == 39 || code == 68){ 
    x += 1; 
    } 

    el.preventDefault(); 
} 
+1

El retraso de la repetición es un entorno OS, no es una cosa JavaScript –

Respuesta

28

lugar de tratar de reaccionar directamente con el evento KeyDown, sugeriría que utilice los eventos KeyDown y KeyUp para mantener una lista de las teclas que están actualmente hacia abajo. Luego implemente un "bucle de juego" que verifique cada x milisegundos qué teclas están caídas y actualice la pantalla en consecuencia.

var keyState = {};  
window.addEventListener('keydown',function(e){ 
    keyState[e.keyCode || e.which] = true; 
},true);  
window.addEventListener('keyup',function(e){ 
    keyState[e.keyCode || e.which] = false; 
},true); 

x = 100; 

function gameLoop() { 
    if (keyState[37] || keyState[65]){ 
     x -= 1; 
    }  
    if (keyState[39] || keyState[68]){ 
     x += 1; 
    } 

    // redraw/reposition your object here 
    // also redraw/animate any objects not controlled by the user 

    setTimeout(gameLoop, 10); 
}  
gameLoop(); 

Se dará cuenta de que esto le permite manejar múltiples teclas a la vez, por ejemplo, si el usuario presiona la izquierda y hacia arriba junto flechas, y el problema de la demora entre los eventos posteriores keydown cuando una tecla se mantiene pulsada va lejos, ya que todo lo que realmente importa es si se ha producido una copia de teclado.

que se dan cuenta de que no puede estar implementando un juego, pero este concepto "bucle del juego" debe trabajar para usted como se muestra en esta simple demostración: http://jsfiddle.net/nnnnnn/gedk6/

+1

De nada. (Tenga en cuenta que existen técnicas más complicadas que los codificadores de juegos serios usarían para controlar la velocidad del bucle del juego, pero puede buscarlas si le interesa; esta respuesta fue una simple introducción al bucle y la tecla del juego). conceptos de estado para superar su problema actual.) – nnnnnn

+0

@nnnnnn Este fragmento de código se convierte en la solución a un problema que estoy teniendo. Gracias por el código! Sin embargo, ¿hay alguna forma de que pueda detectar un 'keyup' (para poder disparar otra función)? – AKG

+2

@AKG - Bueno, el ejemplo que di ya tiene un manejador de teclas, por lo que puede agregar una llamada a su función allí. O simplemente agrega un segundo controlador de teclado. – nnnnnn