Javascript запуск секундомера после ключевого события - PullRequest
0 голосов
/ 22 июня 2019

Я работаю над игрой с элементом canvas. Цель состоит в том, чтобы при первом нажатии клавиши запускался секундомер. Это должно закончиться, как только появится игровой экран / винскрин.

После игрового экрана / винскрина он должен работать как прежде (если нажать кнопку, затем запустить секундомер)

Проблема в том, что функция может быть вызвана только один раз.

Код (самая важная часть):

function startTime(){
    startTime = function(){};
    var count = 0;
    function stopwatch(){
        if(winScreen || gameOver){ 
            count = 0;
        } else{
            console.log(count++);
        }
    }
    setInterval(stopwatch, 1000);
}
document.addEventListener('keydown', function(event){
    startTime();
});

Есть ли способ решить эту проблему?

1 Ответ

1 голос
/ 22 июня 2019

Причина вашей проблемы в том, что вы перезаписываете startTime пустой функцией во второй строке.Во второй раз, когда вы вызываете startTime (), он запускает пустую функцию.

Чтобы сохранить ваш код в чистоте, ваш секундомер на самом деле не должен проверять условия выигрыша или переигрывания - он должен только отслеживать счет,Остальная часть кода вашей игры может запускать и сбрасывать секундомер при возникновении таких условий.Вы могли бы иметь объект секундомера как это:

var stopwatch = {
  count: 0,
  
  intervalId: null,
  
  start: function() {
    stopwatch.intervalId = setInterval(function() {
      stopwatch.count++;
    }, 1000)
  },
  
  reset: function() {
    if (stopwatch.intervalId) {
      clearInterval(stopwatch.intervalId);
      stopwatch.intervalId = null;
    }
    stopwatch.count = 0;
  }
}

Тогда ваша игра может вызвать stopwatch.start (), когда она запускается, и stopwatch.reset (), когда она заканчивается.

Обратите внимание, что она также очищаетинтервал, когда он сбрасывается.Без этого функция внутри setInterval будет дублироваться каждый раз, вызывая потенциальные ошибки и утечку памяти.

...