keypress
キーを押し続けると繰り返される、でもこれがあることは知っていWindow
ますが、繰り返しが始まる前にこのわずかな一時停止があります。この一時停止はしたくない。一時停止した後ではなく、すぐにプレーヤーに反応させたいゲームを書いています。
Webベースのゲームのキーボードイベントを処理するための好ましい方法は何ですか?
keypress
キーを押し続けると繰り返される、でもこれがあることは知っていWindow
ますが、繰り返しが始まる前にこのわずかな一時停止があります。この一時停止はしたくない。一時停止した後ではなく、すぐにプレーヤーに反応させたいゲームを書いています。
Webベースのゲームのキーボードイベントを処理するための好ましい方法は何ですか?
「keypress」ではなく「keydown」をリッスンします。キーダウンは、離すまで絶えず発火します。
しかし:
次のようなことをしないでください。
window.addEventListener("keydown", function (evt) {
if (evt.keyCode === 32) { player.fire(); }
});
1 秒間に 15 回発射する人もいれば、1 秒間に 60 回発射する人もいれば、1 秒間に 120 回発射する人もいます。
代わりに、 n イベントが発生するたびに自分自身を更新する Keyboard オブジェクトを用意します。
var Keyboard = {
keys : {},
keyPress : function (evt) {
if (this.keys[evt.keyCode] > 0) { return; }
this.keys[evt.keyCode] = evt.timeStamp || (new Date()).getTime();
},
keyRelease : function (evt) {
this.keys[evt.keyCode] = 0;
}
};
window.addEventListener("keydown", Keyboard.keyPress.bind(Keyboard));
window.addEventListener("keyup", Keyboard.keyRelease.bind(Keyboard));
次に、更新サイクル中に、キャラクターが必要Keyboard
なキーをチェックするようにします。
追加のボーナスとして、チャージアップショットを追加したり、ボタンを押して高くジャンプしたりしたい場合に備えて、キーには最初に押されたときのタイムスタンプがあります.
次に、ユニットは、発砲が許可されている頻度や、最後に発砲したのはいつであるかなどを、独自の更新エリア内で追跡する必要があります。
スティーブが言ったように、それは不可能です。keydown / keyup イベントをリッスンし、押されたボタンを追跡する必要があります。
var pressedKeys = {};
$(window)
.bind("keydown", function(e) {
pressedKeys[e.keyCode] = true;
})
.bind("keyup", function(e) {
delete pressedKeys[e.keyCode];
})
;
ゲームでは、これらすべてのイベントを処理するメインループがどこかにあるのが一般的だと思います。
setInterval(function() {
if (pressedKeys[38]) { // if up is pressed
// do stuff
}
}, 50);