Это происходит потому, что в вашей функции рисования вы делаете все наоборот; -)
В настоящее время вы сначала заполняете текущий путь, затем объявляете его и, наконец, обновляете позицию.Вам нужно сделать все наоборот, чтобы вы заполнили последнюю версию своих рисунков, вместо того, чтобы ждать, пока это сделает один кадр.
Это исправилось, когда получалось более одной фигурынарисован потому что в том же кадре следующие фигуры рисовали текущее состояние предыдущей фигуры.
const body = document.getElementsByTagName("body")[0];
const canvasWidth = 500;
const canvasHeight = 820;
const canvas = document.createElement('canvas');
var ctx = canvas.getContext("2d");
var frame_count = 0;
var speed = 1;
var pipes = [];
function Pipe(height) {
this.x = canvasWidth;
this.height = height;
this.update = function() {
// first update position
this.x = this.x - (1 * speed);
ctx.fillStyle = 'black';
// then declare the path
ctx.beginPath();
ctx.rect(this.x, 0, 100, this.height);
// finally draw it
ctx.fill();
};
}
function setup() {
// Render blank canvas to dom
canvas.width = canvasWidth;
canvas.height = canvasHeight;
body.appendChild(canvas);
}
function draw() {
// Clear canvas
ctx.clearRect(0, 0, canvas.width, canvas.height);
// Pipe generator
if (frame_count % 100 === 0) {
if (frame_count % 200 === 0) {
pipes.push(new Pipe(100));
} else {
pipes.push(new Pipe(120));
}
}
// Draw pipes
for (i = 0; i < pipes.length; i++) {
pipes[i].update();
}
}
function loop() {
// do not mix setTimeout and rAF, it's like having a Ferrari parked in a truck...
// setTimeout(function() {
draw();
frame_count++;
requestAnimationFrame(loop);
// }, 0);
}
setup();
loop();