@Rubix
Учусь на React-разработчика.

Как мне исправить этот баг со змейкой?

Всем привет! Я сделал игру "змейка" на js. Все работает, но есть кое-какой баг.
Я поставил ограничение: если направление змейки налево, нельзя нажать направо, если вверх, тогда нельзя нажать вниз и т.д., то есть, нельзя идти в противоположною сторону. Это работает, но если резко нажать две клавиши, то змейка пойдет назад. Например, направление змейки вверх, а я нажимаю влево и сразу вниз. Змейка идет вниз и умирает из-за столкновения с хвостом.
Использую элементарный keydown:
let dir;
canvas.onkeydown = function(event) {
  if(event.key == 'ArrowLeft' && dir != "r"){
    dir = "l";
  }
  else if(event.key == 'ArrowRight' && dir != "l"){
    dir = "r";
  }
  else if(event.key == 'ArrowUp' && dir != "d"){
    dir = "u";
  }
  else if(event.key == 'ArrowDown' && dir != "u"){
    dir = "d";
  }
}

Dir отслеживается постоянно.
P.S. если надо, могу выслать весь проект
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
@Azperin
Дилетант
самый простой костыль - это сделать переменную типа "once" и каждый игровой цикл обновлять ее

while(true) {
	snakeMove(direction);
	once = false;
};

on.keydown(function(event) {
	if (once) return; // если направление уже было выбрано до шага
	let oldDir = dir;
	switch(event.key) {
		case 'ArrowLeft': dir = (dir === 'r') ? oldDir : 'l'; break;
		case 'ArrowRight': dir = (dir === 'l') ? oldDir : 'r'; break;
		case 'ArrowUp': dir = (dir === 'd') ? oldDir : 'u'; break;
		case 'ArrowDown': dir = (dir === 'u') ? oldDir : 'd'; break;
		default: break;
	};
	
	once = oldDir !== dir; // если направление хоть както изменилось
	
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@eandr_67
web-программист (*AMP, Go, JavaScript, вёрстка).
Это не баг, а вполне нормальное поведение. Ведь задача играющего - вовремя сменить направление. И слишком торопиться - это такая же ошибка, как и не успеть.

Но если не нравится, при изменении направления установить флаг, блокирующий дальнейшие изменения направления. И снимать этот флаг, только когда змейка сделала "шаг".

Можно все нажатия, пока флаг установлен, записывать в буфер. И при снятии флага менять направление на последнее, записанное в буфере.

P.S. А зачем 4 клавиши? Достаточно ведь только двух: повернуть влево и повернуть вправо относительно текущего направления движения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы