6

イベント境界外のオブジェクトへのアクセスに関して問題があります。オブジェクトを配列に入れてその配列をチェックアウトすると、配列も空になりますが、イベントスコープではいっぱいになります。イベントスコープ外のオブジェクトにアクセスするにはどうすればよいかを知る必要があります。

for (var i = 0; i < 19; i++){
    var loader = new THREE.OBJMTLLoader();

    loader.addEventListener( 'load', function ( event ) {
        var tree = event.content;
        myWorld.setWorldTreePosition(multiplier);

        tree.position.y = 0;
        tree.position.x = myWorld.myTreePosition.position.x;
        tree.position.z =  myWorld.myTreePosition.position.z;
        tree.rotation.x = -(Math.PI / 2);
        tree.scale.set(10,5,5);
        scene.add( tree );
        collidableMeshList2.push(tree);

        tree.castShadow = true;
        //collidableMeshList.push(tree);
        multiplier += 500;

        console.log(collidableMeshList2); // here it is full of trees.
    }
);

loader.load( 'obj/Palm_Tree.obj', 'obj/Palm_Tree.mtl' );
//outside this all becomes empty.

console.log(collidableMeshList2); // here is list is empty but I don't know why.
4

1 に答える 1

2

それは範囲についてではありません。ローダーがオブジェクトをロードするのを待ってからツリーを表示する必要があるため、空です。これは、addEventListener( "load")が行うことです。コードスニペットの最後の行は、ロード関数の前に実行されます。

コードスニペットは紛らわしいです。forループで何をしようとしているのかすぐにはわかりません。多くのローダーを作成し、それらにロードイベントリスナーをアタッチしています。ただし、loader.load()呼び出しはループの後にあるため、最後のローダーに適用されます。ローダーオブジェクトの作成をforループの外側に移動するか、loader.load呼び出しをループの内側に移動することをお勧めします。

于 2012-12-06T14:58:56.487 に答える