3

keypressキーを押し続けると繰り返される、でもこれがあることは知っていWindowますが、繰り返しが始まる前にこのわずかな一時停止があります。この一時停止はしたくない。一時停止した後ではなく、すぐにプレーヤーに反応させたいゲームを書いています。

Webベースのゲームのキーボードイベントを処理するための好ましい方法は何ですか?

4

2 に答える 2

6

「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なキーをチェックするようにします。
追加のボーナスとして、チャージアップショットを追加したり、ボタンを押して高くジャンプしたりしたい場合に備えて、キーには最初に押されたときのタイムスタンプがあります.

次に、ユニットは、発砲が許可されている頻度や、最後に発砲したのはいつであるかなどを、独自の更新エリア内で追跡する必要があります。

于 2012-11-25T16:30:44.587 に答える
4

スティーブが言ったように、それは不可能です。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);
于 2012-11-25T16:03:00.813 に答える