Я работаю над проектом игры со змеями (для курса JavaScript).
Я стараюсь избежать «ошибки», заключающейся в том, что при одновременном использовании двух клавиш игра считает, что столкновения нет, а визуально нет.
Код для управления клавишами на клавиатуре
document.onkeydown = function handleKeyDown(e){
const key = e.keyCode;
let newDirection;
switch(key){
case 37:
newDirection = "left";
break;
case 38:
newDirection = "up";
break;
case 39:
newDirection = "right";
break;
case 40:
newDirection = "down";
break;
case 32:
restart();
return;
default:
return;
}
snakee.setDirection(newDirection);
}
Как этого избежать?
Кто-то сказал мне о событии protectDefault (), стоит ли его использовать?
EDIT1
Вот метод checkCollision, который является частью моей функции конструктора для змеи:
this.checkCollision = function(){
let wallCollision = false;
let snakeCollision = false;
const head = this.body[0];
const rest = this.body.slice(1);
const snakeX = head[0];
const snakeY = head[1];
const minX = 0;
const minY = 0;
const maxX = widthInBlocks-1;
const maxY = heightInBlocks-1;
const isNotBetweenHorizontalWalls = snakeX < minX || snakeX > maxX;
const isNotBetweenVerticalWalls = snakeY < minY || snakeY > maxY;
if(isNotBetweenHorizontalWalls || isNotBetweenVerticalWalls){
wallCollision = true;
}
for(let i = 0;i < rest.length;i++){
if(snakeX == rest[i][0] && snakeY == rest[i][1]){
snakeCollision = true;
}
}
return wallCollision || snakeCollision;
};
EDIT2:
Итак, после ваших ответов, здесь используется решение.
Я использовал switch
раньше, я решил использовать if/else
вместо.
const map = {};
onkeydown = onkeyup = function(e){
e = e || event;
map[e.keyCode] = e.type == 'keydown';
let newDirection;
if(map[37]){
newDirection = "left";
} else if(map[38]){
newDirection = "up";
} else if(map[39]){
newDirection = "right";
} else if(map[40]){
newDirection = "down";
} else if(map[32]){
restart();
}
snakee.setDirection(newDirection);
}
НО , проблема все еще существует, если все свойства объекта карты имеют значение false, что происходит, когда я нажимаю две клавиши одновременно.
Object {
32: false,
37: false,
38: false,
39: false,
40: false
}
Я не знаю, как это предотвратить.