Как удалить объект из массива внутри игрового цикла (setInterval) - PullRequest
0 голосов
/ 08 октября 2019

У меня есть событие click, которое проверяет, должен ли объект в массиве быть удален (isSquashed), и когда оно истинно, мы удаляем объект из списка массива, но когда это условие наступает, мне нужно либо выйти из цикла, либоуменьшить значение i, в основном я хочу выйти из цикла for и снова вызвать gameloop с длиной списка newArray после объединения объекта массива

Я пробовал оба способа

  1. повторение цикла for в обратном направлении
  2. предоставление оператора break (получение нелегального оператора break), но это все еще не происходит для меня, поэтому кто-то может помочь мне с этим и дать мне знать, как я мог бы это исправить,

    maingameloop = function(antsArray) {
    
      //inititialization
    
      // antsArray[i].draw();
      // antsArray[i].checkifSmashed();
    
      //gameloop
      if (this.isplaying) {
        console.log(this.score);
        for (let i = 0; i < antsArray.length; i++) {
          let gameloop = setInterval(() => {
              antsArray[i].move();
              antsArray[i].update(antsArray);
    
              if (antsArray[i].isSquashed) {
                this.score++;
                antsArray.splice(i, 1);
                // i--;
                clearInterval(gameloop);
    
                // this.isplaying = false ;
              }
            },
            this.FRAME_RATE,
          );
        }
      } else {
        //gameover
        // this.maingameloop(antsArray);
      }
    }
    

o / p, которое я получаю, когда удаляю объект из массива:

Uncaught TypeError: Cannot read property 'move' of undefined

Ответы [ 3 ]

1 голос
/ 08 октября 2019

Никогда не рекомендуется зацикливать интервалы или тайм-ауты

Попробуйте это

var cnt = antsArray.length

function ants() {
  if (cnt <= 0) {
    //gameover
    // this.maingameloop(antsArray);
    return;
  }
  if (this.isplaying) {
    console.log(this.score);
    antsArray[cnt].move();
    antsArray[cnt].update(antsArray); // ???
    if (antsArray[cnt].isSquashed) {
      this.score++;
      cnt--;
    }
    setTimeout(play, this.FRAME_RATE);
  }
}
0 голосов
/ 08 октября 2019

Я очистил setInterval, а затем проверил условия и добавил перерыв, который не был бы незаконным, так как я вышел из интервала, и поэтому он сработал для меня, спасибо, ребята, за ваши предложения

maingameloop = function (antsArray) {

    //inititialization

    // antsArray[i].draw();
    // antsArray[i].checkifSmashed();

    //gameloop
    if (this.isplaying) {
      for (let i = 0; i< antsArray.length;  i++) {

      let gameloop = setInterval(() => {
        antsArray[i].move();
        antsArray[i].update(antsArray);

          if (antsArray[i].isSquashed) {
            this.score++;                             
            clearInterval(gameloop);           
          }

        }  
    , this.FRAME_RATE);

    if(antsArray[i].isSquashed ){
      antsArray.splice(i, 1);
     break;
    }  
    }
  }else {
      //gameover
      // this.maingameloop(antsArray);
    }
  }
0 голосов
/ 08 октября 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...