Matriz com vários objetos com expiração-temporizadores falha

Estou fazendo um jogo em HTML5 e agora tenho um problema perturbador.

No meu jogo, eu tenho uma matriz com todas as partículas, todas as partículas têm temporizadores de expiração, com diferentes atrasos gerados aleatoriamente.

Quando os expiradores expiram, eles excluem seu próprio Object com a função Array.splice (), o que causa problemas, pois a função Array.splice () atrapalha a ordem da matriz.

Primeiro, tive a função da seguinte forma: (n = partículas de sangue a serem geradas, ex = ponto inicial). (Todas as partículas são espalhadas em direções aleatórias a partir do meio e depois são desaceleradas pelo atrito)

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),
        })
   }
}

Então eu tive a função assim e não tinha mais a função de emenda, para que não causasse problemas com a ordem das matrizes, mas ainda um problema, ao percorrer a matriz para alterar os valores x e y, por exemplo, para aplicar fricção, ela falha . A falha é causada por não poder definir valores de null:

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),
        })
   }
}

Eu tive um problema semelhante ao criar temporizadores de expiração para minha própria função de áudio no jogo, mas enganei os erros substituindo null por novo Audio (""). Como isso está relacionado a objetos que não funcionam, pergunto-me se pode haver uma maneira semelhante de criar objetos falsos que não retornem erros se eles não tiverem o valor especificado. Um exemplo:

Para objetos neste caso, isso gerará um erro:

null.x * = fricção <---- fricção = 0,8, porém, lançará um erro

Mas ele funciona com o novo áudio falso quando se trata de áudio:

novo Audio (). play () <---- Não gera um erro

Existe alguma maneira de criar um objeto falso que não retorne erro se não tiver o valor especificado, como no exemplo x? Ou é esse o caminho errado, talvez haja outra solução que não atrapalhe a matriz e os objetos?

Obrigado.

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)
        })
    }
}

Ok FINALMENTE!

@tewathia - Esta é uma boa solução ou pode ser melhorada, quero dizer, não existe outra maneira senão usar "new function ()" para criar um objeto que possa recuperar seu próprio "this"?

questionAnswers(1)

yourAnswerToTheQuestion