2012-07-26 10 views
7

Ich benutze Three.JS, um ein Flugzeug zu bauen und einige Kisten darüber zu setzen. Ich muss manchmal alle Boxen entfernen. Also ich versuche es mit dem folgenden Code zu tun:Kann Objekte mit Three.JS nicht entfernen

for (i = 0; i < scene.children.length; i ++) { 
    var object = scene.children[ i ]; 
    if (object != plane && object != camera) { 
     scene.remove(object); 
    } 
} 

/Diese töten jedes Objekt, das nicht das Flugzeug oder die Kamera ;-)/

Es ein paar Kisten löscht, aber nicht alle von ihnen = ( Wie ich alle Boxen löschen? Grüße, José

+0

sollten Sie Ihr var-Objekt nicht aufrufen. Das ist ein reserviertes Schlüsselwort für die eigentliche Definition eines Objekts. – FlavorScape

+0

Objekt sollte in Ordnung sein, Objekt ist reserviert (mit Großbuchstaben o) – ama2

+0

das ist nicht das Problem ... = (. @ Ama2 ist richtig –

Antwort

21

Sie müssen nach vorne, nicht von vorne nach hinten gehen, wenn Sie Array-Objekte wie diese entfernen.

Was passiert, wenn man einen Knoten entfernt, alle nach dem Verschieben. Angenommen, Sie entfernen scene.children [0]: children [1] wird zur neuen 0, 2 wird zu 1 usw. Wenn Sie von 0 zu array.length gehen, ist die for-Schleife bereits aktiv und überspringt 1 Knoten für jeden, den du löschst.

Als zusätzliches Plus sollte das etwas schneller gehen, besonders wenn Sie viele Objekte haben, da scene.children.length nur einmal statt jeder Schleife erhalten wird.

+0

Sie haben es! Danke @Crazycatz !!! = D = D = D = D = D = D = D –

+0

Danke! :) <3 –

1

sollten Sie nutzen! == statt! = (es ist ein bisschen schneller). Haben Sie versucht, durch Ihre Schleife zu Schritt und Szenen Kinder überprüfen Vielleicht hast du dann dem Flugzeug einige Kästchen hinzugefügt, die nicht gelöscht werden Schleife.

+0

Gute Idee.Das war nicht das Problem, aber danke trotzdem für die Idee Herr @Sebastian Sachtleben.Grüße –

2

@Crazycatz Antwort ist natürlich richtig, aber jetzt sind wir im Jahr 2016 und anstelle der manuellen Iteration können wir nur .slice() nennen und iterieren Array Kopie:

scene.children.slice().forEach(obj => scene.remove(obj)) 

oder ohne ES6 Leckereien:

scene.children.slice().forEach(function(obj) { scene.remove(obj); })