0

単純な2Dゲームを作成しています。キーダウンキーを配列に保存し、ループ内で実行して、ユーザーがキーを押したまま、チャーターがノンストップで動いているように見せたいと思います。

ゲームタイマーのように機能するsetInterval関数を取得しましたが、常にループします。キーを保持するためのリスナーと配列を追加しました。

配列内のキーを確認しましたが、見た目は問題ありませんが、moveRight関数とmoveLeft関数が機能していません。

コードは次のとおりです。

      this.keysPressed = new Array();
      InitGameLoop: function () {
        var that = this;
        setInterval(function () {
            $(document).keydown(function (e) {
                var key = e.which;
                that.keysPressed.push(key);
                for (var i = 0; i < that.keysPressed.length; i++) {
                    if (that.keysPressed[i] == 38) {
                        that.moveRight(worldWidth, 10);
                    }
                    else if (that.keysPressed[i] == 37) {
                        that.moveLeft(10);
                    }
                    log(that.keysPressed, that.yPos);
                    that.keysPressed.pop();
                }
            });
        }, 60);

私の質問は次のとおりです。

  1. 私はweargを何をしていますか?
  2. これは良い考えですか?(そうでない場合は、別のことについて私に勧めてください:))

(私の英語でごめんなさい)

4

2 に答える 2

1

押されたキーを配列に格納する代わりに、各キーコードで「movement」配列の関連する変数をアクティブにします。たとえば、左を押すと、movement['left']=1keyup0に戻すために使用します。

ループで可能な動きごとに配列をチェックし、その時点でアクティブな動きにコアランスで関連する関数をトリガーします。

于 2013-01-27T20:09:32.747 に答える
1

setInterval内にイベントハンドラーを登録することは常に間違っています。あなたの場合、60ミリ秒ごとに追加のリスナーを作成しており、キーを押すと、すべてのリスナーが起動します。また、それらを配列に格納する必要はまったくありません。リスナーを一度登録するだけで、キーを押すたびに起動します。複数のキーが押された場合、リスナーはキーごとに個別に起動します。

$(document).keydown(function (e) {
     var key = e.which;
     console.log(key);
     // call your according functions here
     switch (key){
     case 37: // moving left
        // do stuff
        // set a flag to indicate that you are moving left
        moveleft = true;
        break;
     case 39: // moving right
        // do stuff
        // set a flag to indicate that you are moving right
        moveright = true;
        break;
     }
});

キーダウンをキャッチしているので、フラグを設定する必要があります。このようにして、現在押されているキーを追跡できます。キーアップ時に、これらのフラグを再度リセットします(そのために別のイベントハンドラーが必要です)。

于 2013-01-27T20:09:48.900 に答える