2012-12-06 10 views
6

Mam problem z dostępem do obiektu poza granicami zdarzenia. Jeśli umieściłem obiekt w tablicy i sprawdzę tę tablicę, tablica jest pusta, ale w zakresie zdarzenia jest pełna. Muszę wiedzieć, w jaki sposób mogę uzyskać dostęp do obiektu poza zakresem zdarzenia.THREE.js OBJ Obiekty ładujące

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. 
+0

Powinieneś przynajmniej przesunąć linię pliku pętli poza nią. Możesz dodać wielu detektorów do jednego programu ładującego, ale jeśli ponownie zdefiniujesz obiekt w pętli, zostanie on zastąpiony za każdym razem. Zaktualizuj pytanie, aby uzyskać lepsze odpowiedzi. – recluze

Odpowiedz

2

Tu nie chodzi o zakres; Jest pusty, ponieważ musisz poczekać, aż program ładujący załaduje obiekt, zanim zobaczysz tam drzewa - tak właśnie robi addEventListener ("load"). Ostatni wiersz fragmentu kodu jest wykonywany przed funkcją obciążenia.

Fragment kodu jest mylący, nie od razu widać, co próbujesz zrobić z pętlą for. Tworzysz wiele programów ładujących i dołączasz do nich detektor zdarzeń obciążenia. Ale twoja funkcja loader.load() jest po pętli, więc będzie miała zastosowanie do ostatniego programu ładującego. Prawdopodobnie będziesz chciał przenieść tworzenie obiektu programu ładującego poza pętlę for lub wywołanie loader.load wewnątrz pętli.

+0

** loader.load() ** jest w pętli, więc dotyczy to każdego programu ładującego. Po drugie próbowałem tego bez pętli, ale to też nie działało. Zrobiłem pętlę, ponieważ chcę ładować obiekt raz za razem, ponieważ wymagałem umieszczenia obiektu drzewa w mojej grze w różnych miejscach. –