2012-07-26 9 views
7

を使用してオブジェクトを削除し、私は時々、すべてのボックスを削除する必要があること 比べていくつかの箱を置くカント。だから私は、次のコードでそれをやろうとしている:は、私が飛行機を作るためにThree.JSを使用していThree.JS

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

/これは、平面やカメラではありません各オブジェクトを殺す;-)/

それはいくつかのボックスを削除しますが、ではありませんそれらのすべて=(私は削除することができますどのように すべてのボックス? 挨拶、ホセ・

+0

あなたはあなたのvarオブジェクトを呼び出すべきではありません。これはobjectの実際の定義のための予約されたキーワードです。問題ではない問題ないはずです、オブジェクトは(資本Oで)予約されて – FlavorScape

+0

オブジェクト – ama2

+0

... =(。@ ama2が正しい –

答えて

21

あなたは、このような配列オブジェクトを削除するときに、バックアップしないように、フロント、バックフロントに行く必要があります。

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

何が起こっているかは、ノードが削除され、シフト後にすべてのノードが削除された場合です。 0からArray.lengthとに行くときは、forループすでに上に移動しており、1つのノードをスキップしている 2等、1になり、子供たちは、[1]新しい0になります:あなたはscene.childrenを削除しましょう[0]あなたが削除するすべての人のために。

追加プラスしたように、これはscene.children.lengthのみの代わりに、すべてのループで、一度得ているので、あなたは、多くのオブジェクトを持っている場合は特に、若干速く行く必要があります。

+0

挨拶!おかげ@Crazycatz !!! = D = D = D = D = D = D = D –

+0

ありがとう!:) <3 –

1

あなたは使用する必要があります!==の代わりに!=(DIDあなたのループをステップとシーン子どもたちをチェックしようとしたその少し速いです)。その後、あなたはこの機会に削除されない子どもとして飛行機にいくつかのボックスを追加したのでしょうか?ループ。

+0

良いアイデア。厥は問題ではありませんでしたが、アイデア氏@Sebastian Sachtlebenために、とにかくあなたに感謝します。あなたはそれを得た –

2

@Crazycatzの答えはもちろん正しいですが、今、我々は2016年であり、代わりに手動の反復の私達はちょうど.slice()を呼び出し、配列のコピーを反復処理することができます

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

またはES6グッズなし:

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