7

私はThree.JSを使用して飛行機を作成し、その上にいくつかのボックスを配置しています。時々すべてのボックスを削除する必要があります。だから私は次のコードでそれをやろうとしています:

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

/これは飛行機やカメラではない各オブジェクトを殺します; -) /

一部のボックスは削除されますが、すべてではありません=(すべてのボックスを削除するにはどうすればよいですか?ご挨拶、ホセ

4

3 に答える 3

22

このような配列オブジェクトを削除するときは、前から後ろではなく、前から前に戻る必要があります。

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

何が起こっているのかというと、ノードを削除すると、それがシフトした後にすべてのノードが削除されます。シーンを削除するとします。children[0]:children [1]は新しい0になり、2は1になります。0からarray.lengthに移行すると、forループはすでに移動しており、1ノードをスキップしています。あなたが削除するすべて。

追加のプラスとして、特に多くのオブジェクトがある場合、scene.children.lengthはすべてのループではなく、一度だけ取得されるため、これはわずかに速くなるはずです。

于 2012-07-28T08:20:11.960 に答える
3

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

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

またはES6グッズなし:

scene.children.slice().forEach(function(obj) { scene.remove(obj); })
于 2016-11-21T19:30:27.570 に答える
2

!=の代わりに!==を使用する必要があります(少し高速です)。ループをステップスルーして、その後シーンの子をチェックしようとしましたか?たぶん、このループによって削除されない子として、いくつかのボックスを平面に追加しました。

于 2012-07-27T11:50:04.930 に答える