Если вы хотите, чтобы клавиша повторялась контролируемым образом, вам придется реализовать ее самостоятельно, так как события нажатия клавиши запускаются в зависимости от представления ОС о том, как клавиши должны повторяться.Это означает, что могут быть переменные начальные и последующие задержки, и удерживание двух клавиш одновременно приведет к повторению только одной из них.
Вам придется вести учет того, нажата ли каждая клавиша в данный момент, и игнорироватьkeydown
события, когда клавиша уже нажата.Это связано с тем, что многие браузеры будут запускать событие keydown
, а также событие keypress
, когда происходит автоповтор, и если вы воспроизводите клавишу повтора, вам придется подавить это.
Например:
// Keyboard input with customisable repeat (set to 0 for no key repeat)
//
function KeyboardController(keys, repeat) {
// Lookup of key codes to timer ID, or null for no repeat
//
var timers= {};
// When key is pressed and we don't already think it's pressed, call the
// key action callback and set a timer to generate another one after a delay
//
document.onkeydown= function(event) {
var key= (event || window.event).keyCode;
if (!(key in keys))
return true;
if (!(key in timers)) {
timers[key]= null;
keys[key]();
if (repeat!==0)
timers[key]= setInterval(keys[key], repeat);
}
return false;
};
// Cancel timeout and mark key as released on keyup
//
document.onkeyup= function(event) {
var key= (event || window.event).keyCode;
if (key in timers) {
if (timers[key]!==null)
clearInterval(timers[key]);
delete timers[key];
}
};
// When window is unfocused we may not get key events. To prevent this
// causing a key to 'get stuck down', cancel all held keys
//
window.onblur= function() {
for (key in timers)
if (timers[key]!==null)
clearInterval(timers[key]);
timers= {};
};
};
затем:
// Arrow key movement. Repeat key five times a second
//
KeyboardController({
37: function() { Move(-1, 0); },
38: function() { Move(0, -1); },
39: function() { Move(1, 0); },
40: function() { Move(0, 1); }
}, 200);
Хотя большинство игр на основе экшена имеют фиксированный цикл основного кадра, с которым вы можете связать обработку клавиш вверх / вниз.