Проблема с массивом сдвига Javascript

#javascript #html #arrays #game-development

Вопрос:

Я очень новичок в JS.

Изучал этот учебник (https://youtu.be/0ArCFchlTq4). Я заметил кое-что интересное в этом проекте, и это меня очень беспокоит. Может быть, кто-нибудь сможет помочь мне найти какие-то ответы.

Существует эта часть кода, в которой мы перемещаем массив каналов (код, приведенный ниже). Но после сдвига крайняя левая труба делает эту странную вещь — она задерживает движение на короткое мгновение, заставляя трубопровод визуально сдвигаться на несколько пикселей назад относительно переднего плана, например, который движется с той же скоростью, что и трубы. Это происходит в тот же момент, когда выполняется команда shift, и влияет только на следующий канал в массиве.

Буду так счастлив, если кто-нибудь сможет объяснить мне это и, возможно, дать подсказку по исправлению. Спасибо!

  // if the pipes go beyond canvas, we delete them from the array
            if(p.x   this.w<= 0){
            
                this.position.shift();
                score.value  = 1;
                SCORE_S.play();
                score.best = Math.max(score.value, score.best);
                localStorage.setItem("best", score.best);
            }
        }
    },
    
    reset : function(){
        this.position = [];
    }
    
}

 

Комментарии:

1. на смене есть док : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

2. Спасибо за документ, он помог понять, что происходит!

Ответ №1:

Я полагаю, что это связано с поведением метода .shift ().

Как вы можете видеть на MDN, он изменяет длину массива, в котором он вызывается. Я не прошел весь код целиком, но от

 if(p.x   this.w<= 0){
        
            this.position.shift();
            score.value  = 1;
            SCORE_S.play();
            score.best = Math.max(score.value, score.best);
            localStorage.setItem("best", score.best);
        }
    }
}
 

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

Комментарии:

1. Ооочень большое вам спасибо за ваш ответ! Это помогло мне понять, что происходит и как это исправить! После удаления первого канала новый первый канал в массиве по какой-то причине пропускает этот шаг в один пиксель, как будто он выпадает из следующей версии gameloop и занимает старую позицию. Поэтому, чтобы исправить это, после сдвига я добавил команду для компенсации положения x для нового канала [0]. Теперь, перед следующим изменением функции вытяжки, положение x первой трубы правильное, и все выглядит хорошо.

2. Я добавил оператор if для этой компенсации, чтобы игра не зависала, если в массиве есть только одна труба: this.position.shift(); if((это.позиция. длина >= 1)){ this.позиция[0].x -= 1; }