Сбой массива с несколькими объектами с таймерами истечения

Я делаю игру на HTML5, и теперь у меня возникла тревожная проблема.

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

Когда истекают таймеры истечения, они удаляют свой собственный объект с помощью функции Array.splice (), что вызывает проблемы, поскольку функция Array.splice () испортит порядок массива.

Сначала у меня была такая функция: (n = частицы крови, чтобы появиться, а x и y = начальная точка.) (Все частицы распространяются в случайных направлениях от середины, а затем они замедляются трением)

function spawnBlood(x, y, n) {
    for (var i = 0; i < n; i++) {
        var tetra = Math.floor(Math.random() * 360) * (180 / Math.PI)
        var speed = Math.floor(Math.random() * 4) + 3

        var j = particles.length
        particles.push({
          ,  x: x,
            y: y,
            vx: Math.cos(tetra) * speed,
            vy: Math.sin(tetra) * speed,
            r: 1.5,
            angle: 0,
            expireTimer: setTimeout(function(j) {
                return function() {
                    particles.splice(j, 1)
                }
            }(j), Math.floor(Math.random() * 500) + 500),
        })
   }
}

Тогда у меня была такая функция, и у меня больше не было функции сращивания, так что это не создаст проблем с порядком массивов, но все же есть одна проблема: при циклическом перемещении массива для изменения значений x и y, например, для применения трения, происходит сбой. , Ошибка вызвана тем, что он не может определить значения из нуля:

function spawnBlood(x, y, n) {
    for (var i = 0; i < n; i++) {
        var tetra = Math.floor(Math.random() * 360) * (180 / Math.PI)
        var speed = Math.floor(Math.random() * 4) + 3

        particles.push({
            x: x,
            y: y,
            vx: Math.cos(tetra) * speed,
            vy: Math.sin(tetra) * speed,
            r: 1.5,
            angle: 0,
            expireTimer: setTimeout(function(i) {
                return function() {
                    particles[i] = null

                    for (var j = 0; j < particles.length; j++) {
                        if (particles[particles.length - 1] == null) {
                            particles.splice(particles.length - 1, 1)
                        }
                    }
                }
            }(i), Math.floor(Math.random() * 500) + 500),
        })
   }
}

У меня была похожая проблема при создании таймеров истечения срока действия для моей собственной звуковой функции в игре, но я обманул ошибки, заменив null новым Audio (""). Так как это связано с объектами, которые не работают, поэтому я задаюсь вопросом, может ли существовать подобный способ создания поддельных объектов, которые не возвращают ошибки, если они не имеют указанного значения. Пример:

Для объектов в этом случае это выдаст ошибку:

null.x * = трения <---- трения = 0,8, хотя, будет выдавать ошибку

Но он работает с поддельным новым аудио, когда речь идет об аудио:

new Audio (). play () <---- Не выдает ошибку

Есть ли способ сделать поддельный объект, который не возвращает ошибку, если он не имеет указанного значения, как в примере х? Или это неправильный путь, может быть, есть другое решение, которое не испортит Массив и Объекты?

Благодарю.

function spawnBlood(x, y, n) {
    for (var i = 0; i < n; i++) {
        var tetra = Math.floor(Math.random() * 360) * (180 / Math.PI)
        var speed = Math.floor(Math.random() * 4) + 3

        particles.push(new function() {
            this.x = x
            this.y = y
            this.vx = Math.cos(tetra) * speed
            this.vy = Math.sin(tetra) * speed
            this.r = 1.5
            this.angle = 0
            this.expireTimer = setTimeout(function(self) {
                return function() {
                    particles.splice(particles.indexOf(self), 1)
                }
            }(this), Math.floor(Math.random() * 500) + 500)
        })
    }
}

ОК, наконец-то!

@tewathia - Это хорошее решение или его можно улучшить, я имею в виду, что нет ли другого способа, кроме использования «новой функции ()» для создания объекта, который может получить свое собственное «это»?

Ответы на вопрос(1)

Ваш ответ на вопрос