Не своевременное удаление частиц в анимации

Я делаю с помощью canvas анимацию с потоком из 0 и 1. Цифры должны исчезать за пределами экрана, но почему-то некоторые исчезают даже не долетев до границ экрана, хотя я поставил проверку с запасом. Когда пробую выводить высоту, пишет всё правильно, а рисование как будто идёт не так как должно. Кто знает, пожалуйста подскажите в чём дело.

Вот код.

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext("2d");

const width = 1300;
const height = 650;

canvas.width = width;
canvas.height = height;

var inRad = function(angle) {
  return angle * Math.PI / 180;
};

//анимация
let arr = [];
let timeCtr = 0;
let speed = 2;

const animation = function() {
  ctx.clearRect(0, 0, width, height);

  if (timeCtr === 0) {
    let object = {
      x: Math.random() * (width + 600) - 600,
      y: -10,
      angle: Math.random() * 45,
      rotate: 0,
      nmb: String(Math.floor(Math.random() * 2))
    }
    object.dx = Math.cos(inRad(object.angle)) * speed;
    object.dy = Math.sin(inRad(object.angle)) * speed;
    arr.push(object);
    timeCtr = 10;
  }

  timeCtr--;

  for (var i = 0; i < arr.length; i++) {
    arr[i].x += arr[i].dx;
    arr[i].y += arr[i].dy;

    if (Math.floor(arr[i].y) > height + 40) {
      arr.splice(arr[i], 1);
    }
  }

  for (var i = 0; i < arr.length; i++) {
    ctx.save();
    ctx.translate(arr[i].x, arr[i].y);
    ctx.rotate(inRad(arr[i].rotate));
    arr[i].rotate++;
    ctx.font = "20px Arial";
    ctx.textAlign = "center";
    ctx.textBaseline = "middle";
    ctx.fillStyle = "White";
    ctx.shadowColor = "White";
    ctx.shadowBlur = 15;
    ctx.fillText(arr[i].nmb, 0, 0);
    ctx.restore();
  }

  requestAnimationFrame(animation);
};

window.onload = animation;
body {
  text-align: center;
}

canvas {
  background-color: black;
}
<canvas id="canvas"></canvas>


Ответы (1 шт):

Автор решения: Leonid

Можно проверить индекс элемента, который удаляется каждый раз:

console.log(arr.indexOf([...arr].splice(arr[i],1)[0])); // Всегда 0

Поэтому arr.splice(arr[i], 1); просто заменил на arr.splice(i, 1); и вроде все работает:

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext("2d");

const width = 1300;
const height = 650;

canvas.width = width;
canvas.height = height;

var inRad = function(angle) {
  return angle * Math.PI / 180;
};

//анимация
let arr = [];
let timeCtr = 0;
let speed = 2;

const animation = function() {
  ctx.clearRect(0, 0, width, height);

  if (timeCtr === 0) {
    let object = {
      x: Math.random() * (width + 600) - 600,
      y: -10,
      angle: Math.random() * 45,
      rotate: 0,
      nmb: String(Math.floor(Math.random() * 2))
    }
    object.dx = Math.cos(inRad(object.angle)) * speed;
    object.dy = Math.sin(inRad(object.angle)) * speed;
    arr.push(object);
    timeCtr = 10;
  }

  timeCtr--;

  for (var i = 0; i < arr.length; i++) {
    arr[i].x += arr[i].dx;
    arr[i].y += arr[i].dy;

    if (Math.floor(arr[i].y) > height + 40) {
      arr.splice(i, 1);
    }
  }

  for (var i = 0; i < arr.length; i++) {
    ctx.save();
    ctx.translate(arr[i].x, arr[i].y);
    ctx.rotate(inRad(arr[i].rotate));
    arr[i].rotate++;
    ctx.font = "20px Arial";
    ctx.textAlign = "center";
    ctx.textBaseline = "middle";
    ctx.fillStyle = "White";
    ctx.shadowColor = "White";
    ctx.shadowBlur = 15;
    ctx.fillText(arr[i].nmb, 0, 0);
    ctx.restore();
  }

  requestAnimationFrame(animation);
};

window.onload = animation;
body {
  text-align: center;
}

canvas {
  background-color: black;
}
<canvas id="canvas"></canvas>

→ Ссылка