2012-09-05 12 views
14

Eventuali duplicati:
JavaScript move delay and multiple keystrokesCome risolvere ritardo in javascript keydown

io sono nuovo e di apprendimento HTML5 canvas insieme con javascript. Ho creato un evento per spostare un oggetto a sinistra ea destra, e il mio problema è il ritardo ogni volta che si tiene premuto il tasto o si passa a un altro tasto. So che manca il mio codice qui sotto, per favore aiutami. Grazie in anticipo.

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

Il ritardo di ripetizione è un ambiente operativo, non è una cosa JavaScript –

risposta

28

Piuttosto che cercare di reagire direttamente all'evento keydown, io suggerirei di usare gli eventi KeyDown e KeyUp di mantenere un elenco dei quali tasti sono attualmente in giù. Quindi implementa un "loop di gioco" che controlla ogni millisecondo x quali tasti sono giù e aggiorna il display di conseguenza.

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

Si noterà che questo consente di gestire più tasti contemporaneamente, ad esempio, se l'utente preme sinistra e frecce insieme, e il problema del ritardo tra successivi eventi KeyDown quando un tasto viene premuto va via perché tutto quello che ti interessa davvero è se si è verificato un key-up.

mi rendo conto che non può essere l'implementazione di un gioco, ma questo concetto "gioco loop" dovrebbe funzionare per voi, come mostrato in questo molto semplice demo: http://jsfiddle.net/nnnnnn/gedk6/

+1

Prego. (Nota che ci sono tecniche più complicate che i codificatori di giochi seri userebbero per controllare la velocità del ciclo di gioco, ma puoi farlo con Google se sei interessato - questa risposta era intesa come una semplice introduzione al ciclo di gioco e alla chiave- concetti di stato per farti superare il tuo problema attuale.) – nnnnnn

+0

@nnnnnn Questo frammento di codice diventa la soluzione a un problema che sto avendo. Grazie per il codice! Tuttavia, esiste un modo per rilevare un 'keyup' (in modo che possa sparare a un'altra funzione)? – AKG

+2

@AKG - Beh, l'esempio che ho dato ha già un gestore keyup, quindi puoi aggiungere una chiamata alla tua funzione lì. O semplicemente aggiungi un secondo gestore di chiavi. – nnnnnn