Как сделать ожидание нажатия кнопки и потом разрешить нажатия следующих кнопок?

Всем доброго времени суток, хотел бы спросить, как сделать ожидание нажатия кнопки и потом разрешить нажатие следующих кнопок?
Разъясню подробнее: Я делаю игру на HTML5 + CSS3 + JS/JQuery, ритмичная игра, в общем, написал не большой код, генерации стрелок (случайно/рандомно) и добавления их в div - "arrows", есть 4 стрелки (влево, вверх, вправо, вниз) так как их только 4 стрелки, то конечно же некоторые из 4 стрелок генерируется 2+ раз в одной строке стрелок. Нужно сделать так, чтобы после генерации стрелок, поочередно проверять, если все правильно нажаты (проверка идет справа налево - такова игра), то есть - пока не нажал первую стрелку, не сможешь нажать вторую, третью и так далее.. При промахе (не вовремя нажата стрелка - она просто удаляется), значит нужно сделать так, чтобы следующие стрелки прожимались по той же траектории (системе) о которой написал чуть выше.

Вот код генерации стрелок:
function create(step_arrow) { // Функция содержит аргумент step_arrow, который принимает номер стрелки, то есть, это будущий ID стрелки при её появлении.
// Функция вызывается такой строкой: setTimeout(create("1"), 80040);
// Единица в setTimeout(create("1"), 80040); это ID стрелки, то есть каждая такая строка, это вызов стрелки в  нужно время.
	var array = ["left","right","up","down"]; // Массив стрелок (влево, вправо, вверх, вниз)
	var i; // Переменная для цикла
	var generated; // Переменная, которая будет содержать, сгенерировую стрелку.
	
	for (i = 0; i < array.length; ++i) { // Цикл вывода стрелок из массива
    	generated = array[Math.floor(Math.random() * array.length)]; // Генерация стрелки из массива в generated
	}

	$(".arrows").append("<div id='"+step_arrow+"' class='arrow-"+generated+"'></div>");  // Добавляем стрелку в div - "arrows" с особым ID (step_arrow).

        // Стили для стрелок
	$(".arrow-left").css({
				background: 'url(\'img/arrow-left-normal.png\')',
				width: '41px'
	});
	$(".arrow-right").css({
				background: 'url(\'img/arrow-right-normal.png\')',
				width: '41px'
	});
	$(".arrow-up").css({
				background: 'url(\'img/arrow-up-normal.png\')',
				width: '39px'
	});
	$(".arrow-down").css({
				background: 'url(\'img/arrow-down-normal.png\')',
				width: '39px'
	});
        // Конец стилей

	var correct = ".arrow-" + generated; // Присваиваем название сгенерированной стрелки к .arrow-, чтобы наложить на стрелку анимацию передвижения.

// Анимация
	$(correct).animate({ 
           left: "950px",
      	   }, 2113, "linear", function() {
    	   if ($(correct).length > 0)
    	   {
    	       $('.mark').css({
       	          width: '106px',
       	          height: '40px',
       	          background: 'url(\'img/miss.png\')'
       	       });
             $(correct).remove(); // Удаляем стрелку, если она не была нажата вовремя (по позиции).
          }
 });


А вот функция которая проверяет нажатие стрелки и по позиции передвижения стрелки выдавать оценку (когда была нажата стрелка):
$(window).keydown(function(evt) { // При нажатии на любую клавишу клавиатуры, начинается проверка.
	var keycode = evt.which; // Переменная keycode содержит код нажатой клавиши.
	var keyname; // Переменная keyname будет содержать имя нажатой стрелки, смотрите ниже:
	if (keycode == 37) {keyname = "left";}
	if (keycode == 38) {keyname = "up";}
	if (keycode == 39) {keyname = "right";}
	if (keycode == 40) {keyname = "down";}


if ($('.arrow-'+keyname).length > 0) // Идет проверка, если существует стрелка, точнее идет присваивания название нажатой стрелки к div стрелки и идет проверка, существует ли такая стрелка
	{
               // При особых позициях стрелки будет вызвана функция mark, которая принимает название оценки и название нажатой стрелки.
		var pos = $('.arrow-'+keyname).position();
		if (pos.left < 718) {
		   	mark('miss', keyname);
		   }
		if (pos.left > 718 && pos.left < 734) {
		   	mark('bad', keyname);
		   }
		if (pos.left > 734 && pos.left < 744) {
		   	mark('good', keyname);
		   }
		if (pos.left > 744 && pos.left < 765) {
		   	mark('cool', keyname);
		   }
		if (pos.left > 765 && pos.left < 769) {
		   	mark('perfect', keyname);
		   }
		if (pos.left > 769 && pos.left < 781) {
		   	mark('cool', keyname);
		   }
		if (pos.left > 781 && pos.left < 790) {
		   	mark('good', keyname);
		   }
		if (pos.left > 790 && pos.left < 800) {
		   	mark('bad', keyname);
		   }
		if (pos.left > 800) {
		   	mark('miss', keyname);
		   }
	}
});


И вот собственно функция mark которая выводит оценки:
function mark(grade, arrow) // Функция вывода оценок, принимает название оценки и нажатую стрелку
{
        // Стили вывода оценок и анимация
	$('.mark').css({
	background: 'url("img/'+grade+'.png") no-repeat top center'
	});
	setTimeout(function(){$('.mark').css({ background: 'none' });}, 500);
	$(".arrow-"+arrow).remove();
	$(".effect-bg-mode").css({ background: 'url("img/'+arrow+'-effect.png")'});
	setTimeout(function(){$(".effect-bg-mode").css({ background: 'none'});}, 500);
       // Конец стилей и анимации
}


Подскажите пожалуйста, как сделать ожидание между нажатиями стрелок? Чтобы нельзя было нажать например 2 или 5 стрелку, а строго с начала, точнее с 1 стрелки и так далее.

Дополнение к написанному выше:
8fc8aa654ef942b48481154c5d67a82f.png

К сожалению, на хостинг не смог залить, там какие то проблемы, скину исходники:
Ссылка на исходники - Dropbox
  • Вопрос задан
  • 4751 просмотр
Решения вопроса 1
romanzhak
@romanzhak
Mathematician
Создайте объект, хранящий состояния кнопок. Затем проверяйте, какие нажал пользователь, и последовательно активируйте их.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Angelina_Jo
Оффтоп - можно не читать
Клёвая игра. :) Я бы картинки стрелок (да и все другие спрайты) собрала бы в одну картинку. Думается, так будет надёжнее. :)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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