使用类似的东西:
window.addEventListener("keydown", handleFn, true);
对于多人游戏,我如何能够同时处理多个按键?多人会使用一个键盘,因此同时按下Q和P键可以在屏幕上移动不同的对象。
我还没有任何keyup
句柄,并想知道这是否可以解决这个问题。
到目前为止我的逻辑是:
if keydown == Q
paddle.left = true;
...
//game loop
if paddle.left == true
paddle.x -= 1;
paddle.left = false;
玩家也可以按住按钮。
答案 0 :(得分:17)
这就是我一般的做法。首先,你需要一个数组来保存keystates。
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和箭头键。
<强> Live Demo 强>
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;
});
答案 1 :(得分: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);
})();
})();
这个设置的好处是它可以直接将操作与键相关联,允许您轻松添加更多键操作,并允许在运行时轻松添加/删除键按键的灵活性,甚至在任何给定时间改变特定键的作用。