2016-06-29 3 views
-1

Я построил игру симона. Он работает правильно, если пользователь играет правильно, но в попытке сделать его полным доказательством. Я хотел отключить пользователя от выбора, пока компьютер показывает следующий шаблон. Я пробовал много комбинаций использования jquery .on/.off .unbind/.bind с e.preventDefault, но не имел успеха. Может кто-то, пожалуйста, помогите мне с решением по добавлению этой функции. Это кодовая ссылка, если вы хотите увидеть полный проект, поскольку я собираюсь опубликовать то, что похоже на соответствующий код ниже. http://codepen.io/RawleJuglal/full/vKxwWw/Simon Says Игра неспособна отключить колодки цвета во время поворота компьютера

HTML:

<div class='gameContainer'> 
    <div class="center"></div> 
    <a href="#" id="1" class="field blue"></a> 
    <a href="#" id="2" class="field yellow "></a> 
    <a href="#" id="3" class="field red"></a> 
    <a href="#" id="4" class="field green"></a> 
</div><!--End of gameContainer--> 

CSS:

function playComputerSequence(seq,speed){ 
    //Preventing pressing not working 
    $('.field').each(function(){ 
    $(this).off('click',function(e){ 
     e.preventDefault(); 
    }); 
    }); 
    //Everything below this working correctly 
    var count = Number($('.count span').text()); 
    var i = 0; 
    var interval = setInterval(function(){ 
    $('#'+seq[i]).addClass('on'); 
    var audio = new Audio(audioArray[seq[i]-1]); 
    setTimeout(function(){ 
     audio.play(); 
     $('#'+seq[i]).removeClass('on'); 
     i++; 
    },500) 
    setTimeout(function(){ 
     if(i == count) 
     { 
      clearInterval(interval); 
     } 
    },500); 
    },speed); 
    $('.field').each(function(){ 
    $(this).off().on('click',recordUserChoice); 
    }); 
} 

function recordUserChoice(){ 
    userArray.push(this.id); 
    var audio = new Audio(audioArray[this.id-1]); 
    setTimeout(function(){ 
    audio.play(); 
    },500); 
    checkSequence(userArray); 
} 
+1

Adjit является правильным, '.off()' не принимает функцию Анон в том, как вы определил его. он принимает только ссылку на имя функции для удаления этого конкретного обработчика события из элемента. – Ryan

ответ

1

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

Очевидно, .off() не выполняет трюк, так что я бы сказал, удалите все ссылки на это. Однако я считаю, что причина, по которой он не работает, заключается в том, что вы используете его неправильно. При отсоединении вам не нужно использовать .each(). Для этого используется селектор, поэтому, если вы используете $('.field').off('click', '**'), который должен удалить все делегированные обработчики кликов из любых элементов с помощью class='field'. Чтобы узнать о правильном использовании, я бы предложил посмотреть здесь: http://api.jquery.com/off/

Однако я до сих пор не верю, что вы должны удалить делегированные события. Для упрощения вещей есть только флаг, который можно проверить, чтобы увидеть состояние игры.

var gameState = 0; //0 means the user can click, 1 means the user cannot 

function playComputerSequence(seq, speed){ 
    gameState = 1; 

    //Rest of function code 
    //... 

    gameState = 0; 
} 

function recordUserChoice(){ 
    if(gameState === 1) return; //if gameState is 1, jump out of the function 

    //Rest of function code 
    //... 
} 

Хотя эта логика работает, для вашей ситуации ее нужно немного поменять.

В начале вашего кода, ниже audioArray введите код ниже. Это будет ваш обработчик кликов field.

$(document).on('click', '.field', recordUserChoice); 

Тогда одна вещь, которую я понял, что gamestate в основном сразу же получает изменено на 0, так что я вместо того, чтобы положить, что ниже, где вы clearInterval(interval) так это то, что определяет, когда компьютер осуществляется движение.

if(i == count) 
{ 
    clearInterval(interval); 
    gamestate = 0; 
    console.log(gamestate); 
} 

После этого вы можете удалить все экземпляры $('.field').each()

Смотрите эту ручку: http://codepen.io/anon/pen/wWJLyp

+0

Ваше решение имеет смысл для меня, я пытался его реализовать. Мое обновленное перо выглядит так: http://codepen.io/RawleJuglal/pen/vKxwWw Прямо сейчас во время последовательности comp он записывает 0 и вводит инструкцию else. Я думаю, возможно, из-за setInterval или setTimeout в функции compSequence, не уверен. Но также, если я пытаюсь изменить $ ('. Field'). Each (function() { $ (this) .off(). On ('click', recordUserChoice); }); - $ ('. Field) .on (' click ', recordUserChoice); Игра разбивается, как будто он вызывает recordUserChoice дважды.Поэтому я не могу удалить это, как вы сказали, и протестировать –

+0

@RawleJuglal ​​посмотреть. – Adjit

+0

Удержал тестирование и переместил gameState = 0, чтобы восстановить способность пользователей щелкнуть в функции setTimeout с помощью clearInterval (интервал), и это решило проблему. Большое вам спасибо за совет. Я даже не думал об использовании флага для проверки. –

Смежные вопросы