如果你想在一個可控的方式鍵重複,你將不得不自己實現它,按鍵事件被觸發依賴於密鑰應該如何重複OS的想法。這意味着可能存在可變的初始延遲和延遲,並且一次按下兩個鍵將只導致其中一個重複。
您必須保存當前每個鍵是否被按下的記錄,並且在鍵已經關閉時忽略事件。這是因爲當發生自動重複時,許多瀏覽器會觸發以及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中同時按下兩個鍵。將等待答案。 – 2010-09-11 15:02:54
好吧,它確實在做事,但並不像預期的那樣。我的遊戲是一款基於計時器的遊戲,等待重複擊鍵並持續1秒就不好。這很令人沮喪。 – alex 2010-09-11 15:08:22
爲什麼不嘗試使用基於閃存的方法。一個透明的閃存swf捕獲事件,然後相應地調用JS。 http://www.java2s.com/Code/Flash-Flex-ActionScript/Development/UpLeftSensor.htm – 2010-09-11 15:09:55