Tablica z wieloma obiektami z czasem wygasania kończy się niepowodzeniem

Robię grę w HTML5, a teraz mam problem.

W mojej grze mam tablicę ze wszystkimi cząstkami, wszystkie cząstki mają czas wygasania, z różnymi losowymi wygenerowanymi opóźnieniami.

Gdy wygasają czasy wygasania, usuwają tam swój obiekt za pomocą funkcji Array.splice (), która powoduje problemy, ponieważ funkcja Array.splice () zepsuje kolejność tablicy.

Najpierw miałem taką funkcję: (n = cząsteczki krwi do odrodzenia, a x i y = punkt początkowy.) (Wszystkie cząstki są rozmieszczone losowo w kierunkach od środka, a następnie są spowalniane przez tarcie)

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

Wtedy miałem taką funkcję i nie posiadałem już funkcji łączenia, więc nie sprawiłoby to kłopotu z porządkiem tablic, ale wciąż jeden problem, podczas przechodzenia przez tablicę w celu zmiany wartości x i y, na przykład w celu zastosowania tarcia, zawodzi . Niepowodzenie jest spowodowane tym, że nie można zdefiniować wartości z wartości 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),
        })
   }
}

Podobny problem miałem przy tworzeniu liczników czasu ważności dla mojej własnej funkcji audio w grze, ale oszukałem błędy, zastępując wartość null nowym dźwiękiem („”). Ponieważ jest to związane z obiektami, które nie działają, zastanawiam się, czy może istnieć podobny sposób, aby fałszywe obiekty, które nie zwracają błędów, jeśli nie mają określonej wartości. Przykład:

W tym przypadku obiekt rzuci błąd:

null.x * = tarcie <---- tarcie = 0,8, jednak rzuci błąd

Ale działa z fałszywym nowym dźwiękiem, gdy chodzi o dźwięk:

new Audio (). play () <---- Nie rzuci błędu

Czy jest jakiś sposób na utworzenie fałszywego obiektu, który nie zwraca błędu, jeśli nie ma określonej wartości, jak w przykładzie x? Czy jest to zły sposób, czy może istnieje inne rozwiązanie, które nie zepsuje macierzy i obiektów?

Dzięki.

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 WRESZCIE!

@tewathia - Czy jest to dobre rozwiązanie, czy może być ulepszone, to znaczy czy nie ma innego sposobu niż użycie „nowej funkcji ()”, aby obiekt, który może pobrać własne „to”?

questionAnswers(1)

yourAnswerToTheQuestion