keyCode
está deprecated e não é mais recomendado. Em vez disso, uma alternativa é usar a propriedade key
.
Pra que criar o objeto player
se depois você vai desestruturá-lo? Se for usá-lo somente para isso, compensa mais criar as variáveis diretamente.
Além disso, sugiro usar os eventos keydown
e keyup
em conjunto: o primeiro detecta se a tecla foi pressionada, e o segundo detecta se a tecla foi solta. Assim você pode detectar quando o usuário fica segurando a tecla, por exemplo (aí o personagem continua andando, até que a tecla seja solta). E vc também pode mudar duas direções ao mesmo tempo (por exemplo, se eu segurar as setas para cima e direita ao mesmo tempo, ele deveria andar na diagonal).
Um exemplo bem simples pode ser encontrado aqui. Adaptando para o seu caso, ficou assim:
// detecta se cada uma das teclas está pressionada
let up = false, down = false, left = false, right = false;
// A posição do personagem na tela
let pos = { x: 0, y: 0 };
// Velocidade de deslocamento do personagem (pode aumentar para ele andar mais posições de uma vez)
let velocidade = 1;
//Quando pressionada uma tecla específica sinaliza o seu estado como pressionado
document.addEventListener("keydown", (event) => {
if (event.key == "ArrowUp") up = true;
if (event.key == "ArrowDown") down = true;
if (event.key == "ArrowLeft") left = true;
if (event.key == "ArrowRight") right = true;
});
//Quando solta um tecla específica sinaliza o seu estado como não pressionado
document.addEventListener("keyup", (event) => {
if (event.key == "ArrowUp") up = false;
if (event.key == "ArrowDown") down = false;
if (event.key == "ArrowLeft") left = false;
if (event.key == "ArrowRight") right = false;
});
var canvas, ctx;
const color = 'black', altura = 10, largura = 10;
// Ao carregar a página...
window.addEventListener("load", () => {
canvas = document.getElementById('canvas');
ctx = canvas.getContext('2d');
pos.x = canvas.width / 2;
pos.y = canvas.height / 2;
requestAnimationFrame(draw); //inicio do programa
});
// desenha o player na tela
function draw() {
// Para cada uma das teclas do direcional verifica se está pressionada, e aplica um deslocamento
if (up) pos.y -= velocidade;
if (down) pos.y += velocidade;
if (left) pos.x -= velocidade;
if (right) pos.x += velocidade;
ctx.clearRect(0, 0, canvas.width, canvas.height); // limpa o canvas
ctx.fillRect(pos.x, pos.y, largura, altura); // desenha
ctx.fillStyle = color;
requestAnimationFrame(draw); // looping do programa
}