2012-07-26 6 views
7

Używam Three.JS, aby utworzyć samolot i umieścić na nim kilka pudełek. Potrzebuję czasem usunąć wszystkie pudełka. Więc staram się to zrobić za pomocą następującego kodu:Nie mogę usuwać obiektów za pomocą Three.JS

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

/To zabije każdy obiekt, który nie jest samolot lub aparat ;-)/

Usuwa niektóre okna, ale nie wszystkie z nich = ( Jak mogę usunąć wszystkie pola? Pozdrowienia, José

+0

nie powinieneś wywoływać swojego obiektu var. to jest zastrzeżone słowo kluczowe dla rzeczywistej definicji obiektu. – FlavorScape

+0

obiekt powinien być czysty, obiekt jest zarezerwowany (z kapitałem o) – ama2

+0

to nie problem ... = (. @ Ama2 ma rację –

Odpowiedz

21

Powinieneś cofnąć się do przodu, nie od przodu do tyłu, usuwając takie obiekty tablicy.

var obj, i; 
for (i = scene.children.length - 1; i >= 0 ; i --) { 
    obj = scene.children[ i ]; 
    if (obj !== plane && obj !== camera) { 
     scene.remove(obj); 
    } 
} 

To, co się dzieje, to sytuacja, w której usuwa się węzeł, wszystkie po przesunięciu. Powiedzmy, że usuniesz scene.children [0]: dzieci [1] staną się nowymi 0, 2 staną się 1 itd. Gdy przechodzisz od 0 do array.length, pętla for już ruszyła i przeskakuje 1 węzeł za każdego, którego usuniesz.

Dodatkowym plusem powinno być nieco szybsze, szczególnie jeśli masz wiele obiektów, ponieważ scene.children.length jest zbierana tylko raz, zamiast każdej pętli.

+0

Masz to! Dzięki @Crazycatz !!! = D = D = D = D = D = D = D –

+0

Dziękuję! :) <3 –

1

Powinieneś użyć! == zamiast! = (jest nieco szybszy) Czy próbowałeś przejść przez pętlę i sprawdzić sceny dzieci po tym, być może dodaliście do samolotu pewne skrzynki, które nie zostaną przez to usunięte pętla.

+0

Dobry pomysł, to nie był problem, ale dziękuję i tak za pomysł Mr @Sebastian Sachtleben Pozdrowienia –

2

@Crazycatz odpowiedź jest poprawna, ale oczywiście teraz jesteśmy w 2016 i zamiast ręcznego iteracji możemy po prostu zadzwonić .slice() i iteracyjne nad tablicy kopię:

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

lub bez ES6 Korzyści:

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