3

次のようなものを使用します。

window.addEventListener("keydown", handleFn, true);

マルチプレイヤーで使用するために、同時に複数のキープレスを処理するにはどうすればよいですか? 複数の人が 1 つのキーボードを使用するため、Q キーと P キーを同時に押して、画面上のさまざまなオブジェクトを移動します。

まだハンドルがありませんが、keyupこれで解決するのでしょうか。

私がこれまでに持っているロジックは次のようなものです:

if keydown == Q
    paddle.left = true;

...

//game loop
if paddle.left == true
    paddle.x -= 1;
    paddle.left = false;

プレーヤーもボタンを押し続けることが期待できます。

4

2 に答える 2

17

これは私が一般的に行う方法です。まず、キーステートを保持するための配列が必要です。

var keys=[];

次に、イベント リスナーをセットアップします。

// key events
document.body.addEventListener("keydown", function (e) {
    keys[e.keyCode] = true;
});
document.body.addEventListener("keyup", function (e) {
    keys[e.keyCode] = false;
});

以下は、そのキー コードに対応して、配列内の項目を true または false に設定します。

次に、いくつかの条件を使用して、何が押され、何をすべきかを確認するだけです。

    // check the keys and do the movement.
    if (keys[38]) {
        if (velY > -speed) {
            velY--;
        }
    }

    if (keys[40]) {
        if (velY < speed) {
            velY++;
        }
    }
    if (keys[39]) {
        if (velX < speed) {
            velX++;
        }
    }
    if (keys[37]) {
        if (velX > -speed) {
            velX--;
        }
    }

以下は、移動して複数のキーを押して混乱させることができるデモです。wasd と矢印キーを使用します。

ライブデモ

var canvas = document.getElementById("canvas"),
    ctx = canvas.getContext("2d");

canvas.width = canvas.height = 300;

var player1 = {
    x: 50,
    y: 150,
    velY: 0,
    velX: 0,
    color: "blue"
},
player2 = {
    x: 250,
    y: 150,
    velY: 0,
    velX: 0,
    color: "red"
};

var x = 150,
    y = 150,
    velY = 0,
    velX = 0,
    speed = 2,
    friction = 0.98,
    keys = [];

function update() {

    if (keys[38]) {
        if (player1.velY > -speed) {
            player1.velY--;
        }
    }

    if (keys[40]) {
        if (player1.velY < speed) {
            player1.velY++;
        }
    }
    if (keys[39]) {
        if (player1.velX < speed) {
            player1.velX++;
        }
    }
    if (keys[37]) {
        if (player1.velX > -speed) {
            player1.velX--;
        }
    }

    if (keys[87]) {
        if (player2.velY > -speed) {
            player2.velY--;
        }
    }

    if (keys[83]) {
        if (player2.velY < speed) {
            player2.velY++;
        }
    }
    if (keys[68]) {
        if (player2.velX < speed) {
            player2.velX++;
        }
    }
    if (keys[65]) {
        if (player2.velX > -speed) {
            player2.velX--;
        }
    }
    ctx.clearRect(0, 0, 300, 300);
    updatePlayer(player1);
    updatePlayer(player2);
    setTimeout(update, 10);
}

function updatePlayer(player) {
    player.velY *= friction;
    player.y += player.velY;
    player.velX *= friction;
    player.x += player.velX;

    if (player.x >= 295) {
        player.x = 295;
    } else if (player.x <= 5) {
        player.x = 5;
    }

    if (player.y > 295) {
        player.y = 295;
    } else if (player.y <= 5) {
        player.y = 5;
    }

    ctx.fillStyle = player.color;
    ctx.beginPath();
    ctx.arc(player.x, player.y, 5, 0, Math.PI * 2);
    ctx.fill();
}

update();

document.body.addEventListener("keydown", function (e) {
    keys[e.keyCode] = true;
});
document.body.addEventListener("keyup", function (e) {
    keys[e.keyCode] = false;
});
于 2013-03-27T16:32:06.227 に答える
2

次のようなパターンを試すことができます。

(function game(){
    // canvas setup ...

    // set up a "hash" of keycodes associated with whether or not they  
    // are pressed, and what should happen when they are pressed.
    var keys = {
        37:{down:false, action:function(){player1.velX--;}},
        38:{down:false, action:function(){player1.velY--;}},
        39:{down:false, action:function(){player1.velX++;}},
        40:{down:false, action:function(){player1.velY++;}},

        65:{down:false, action:function(){player2.velX--;}},
        68:{down:false, action:function(){player2.velX++;}},
        83:{down:false, action:function(){player2.velY++;}},
        87:{down:false, action:function(){player2.velY--;}},
    };

    document.body.addEventListener("keydown", function (e) {
        if(keys[e.keyCode]) keys[e.keyCode].down = true;
    });
    document.body.addEventListener("keyup", function (e) {
        if(keys[e.keyCode]) keys[e.keyCode].down = false;
    });

    (function update() {
        ctx.clearRect(...);

        for(var key in keys)
            if(keys[key].down)
                keys[key].action();

        // redraw players. 

        requestAnimationFrame(update);
    })();
})();

このセットアップの良いところは、アクションをキーに直接関連付けることで、キー アクションを簡単に追加できるようになり、実行時にキーを押す操作を簡単に追加/削除できる可能性があり、柔軟性が大幅に向上することです。特定のキーの動作をいつでも変更できます。

于 2013-03-27T17:17:37.313 に答える