Если вы хотите повторить ключ в контролируемым образом, вы должны реализовать его самостоятельно, так как события нажатия клавиш увольняют зависит от идеи ОС о том, как ключи должны повторяться. Это означает, что могут быть переменные начальные и последующие задержки, и одновременное удерживание двух клавиш вызовет только одно из них.
Вам нужно будет сохранить запись о том, нажата ли каждая клавиша и проигнорировать события 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);
Хотя большинство игр действий на основе имеют фиксированное время цикла основного кадра, который вы можете связать ключ вверх/вниз обработки в ,
ваш код не будет работать, тот наверняка. Я не уверен, что вы можете проверить, что две клавиши одновременно нажаты в JS. будет ждать ответов. –
хорошо, он работает на деле, но не так, как ожидалось. Моя игра - таймерная игра, и пауза в 1 сек, ожидая повторных нажатий клавиш, не очень хороша. Это расстраивает. – alex
Почему вы не пытаетесь использовать флэш-подход. прозрачный flash swf, который захватывает события, а затем соответственно вызывает JS. http://www.java2s.com/Code/Flash-Flex-ActionScript/Development/UpLeftSensor.htm –