#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; }