Задать вопрос
@fristyr
Начинающий вэб разработчик

Игра застряла в интервале. Как можно решить?

После прохождение игры и окончания всех жизней, выводится модальное окно со счетом набранным в игре. После нажатия ок игра должна очищаться так сказать, точнее принять такое же состояние как при открытыии игры чтобы ее можно было запустить заного. Но после нажатия ок в финальном модальном окне оно появляется заного с обнуленным значением счета. И при открытии инспектора счет в модальном окне странно себя ведет тоесть постоянно обновляется еще до нажатия ок но число не меняется.
Скорее всего я где-то не обнулил интервал или таймаут.
Если кто может взглянуть и подсказать куда мне нужно обратить внимание буду очень благодарен. Спасибо.

https://jsfiddle.net/hmzsrc07/
  • Вопрос задан
  • 107 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Скорее всего я где-то не обнулил интервал или таймаут.

Так точно. В методе gameOver. Должно быть. А вот нету. Надо добавить. Правда, это не сильно поможет. Потому что новый интервал создаётся при каждом клике. Так что надо ещё и обработчик клика снимать. Вы снимаете, но не там и не то (тут следует осознать такую вещь - в removeEventListener следует передавать ту же функцию, что передавалась в addEventListener). Исправлено.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
hzzzzl
@hzzzzl
gameOver() {
    this.finalModalScore.innerHTML = this.score;
    this.endGameModal.classList.add('end-game_show');
  }

  startGame() {
    this.mouseChance();
    this.fillLives();
    this.fillInitScore();
    this.fillInitLevel();
    this.gameInterval = setInterval(() => this.creatingAnimals(), this.speed);

    // листенеры делаем только в первый раз! 
    // иначе они будут дублироваться при начале каждой игры
    document.addEventListener('click', (e) => {
      if (e.target !== this.startButt) {
        this.clickOnEmoji(e);
      }
    });

    // поэтому этот листенер здесь, а не в gameover
    // иначе он будет добавляться каждый раз
    // и функция будет выполняться много раз
    this.closeEndModal.addEventListener('click', () => {
      this.endGameModal.classList.remove('end-game_show');
      this.fillInitScore();
      this.speedValueNum.innerHTML = "1";
      buttonStart.addEventListener('click', buttonClick);
      this.resetGame()
    })
  }

  resetGame() {
    // тут всё возвращаем в исходное состояние
    clearInterval(this.gameInterval)
    this.mouseChance();
    this.fillLives();
    this.fillInitScore();
    this.fillInitLevel();
    this.gameInterval = setInterval(() => this.creatingAnimals(), this.speed);
  }
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы