Array mit mehreren Objekten mit Ablaufzeiten schlägt fehl

Ich mache ein Spiel in HTML5, und jetzt habe ich gerade ein störendes Problem.

In meinem Spiel habe ich ein Array mit allen Partikeln, alle Partikel haben Ablaufzeiten mit unterschiedlichen zufällig erzeugten Verzögerungen.

Wenn die Ablaufzeiten ablaufen, löschen sie ihr eigenes Objekt mit der Funktion Array.splice (), was zu Problemen führt, da die Funktion Array.splice () die Reihenfolge des Arrays durcheinander bringt.

Zuerst hatte ich die folgende Funktion: (n = Blutpartikel, die erscheinen sollen, und x und y = Startpunkt.) (Alle Partikel werden von der Mitte aus in zufälliger Richtung verteilt und dann durch Reibung abgebremst.)

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

Dann hatte ich die Funktion wie diese und hatte die Spleißfunktion nicht mehr, so dass ich keine Probleme mit der Reihenfolge der Arrays habe, aber immer noch ein Problem, wenn ich mich durch das Array schleife, um die x- und y-Werte zu ändern, zum Beispiel um Reibung anzuwenden . Der Fehler wird dadurch verursacht, dass keine Werte von null definiert werden können:

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

Ich hatte ein ähnliches Problem beim Erstellen von Ablaufzeitgebern für meine eigene Audiofunktion im Spiel, habe aber die Fehler durch Ersetzen von null durch neues Audio ("") ausgetrickst. Da dies mit Objekten zusammenhängt, die nicht funktionieren, frage ich mich, ob es eine ähnliche Möglichkeit gibt, gefälschte Objekte zu erstellen, die keine Fehler zurückgeben, wenn sie nicht den angegebenen Wert haben. Ein Beispiel:

Für Objekte wird in diesem Fall ein Fehler ausgegeben:

null.x * = reibung <---- reibung = 0.8 löst jedoch einen Fehler aus

Aber es funktioniert mit dem falschen neuen Audio, wenn es um Audio geht:

new Audio (). play () <---- Wirft keinen Fehler

Gibt es eine Möglichkeit, ein falsches Objekt zu erstellen, das keinen Fehler zurückgibt, wenn es nicht den im Beispiel x angegebenen Wert hat? Oder ist das der falsche Weg, gibt es vielleicht eine andere Lösung, die das Array und die Objekte nicht durcheinander bringt?

Vielen Dank.

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, endlich!

@tewathia - Ist dies eine gute Lösung oder kann sie verbessert werden? Ich meine, gibt es keine andere Möglichkeit, als mit "new function ()" ein Objekt zu erstellen, das sein eigenes "this" abrufen kann?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage