2016-08-29 80 views
0

我有以下代碼:瀏覽器總是崩潰當我運行我的代碼

var images = ["image1.jpg", "image2.jpg", "image3.jpg", "image4.jpg", "image5.jpg", "image6.jpg", "image7.jpg", "image8.jpg"]; 
var objects = []; 
var geometry; 

while(objects.length < images.length) { 

     var imagesIndex = 0; 
     var object = [ 

      texture1 = textureLoader.load("data/"+ images[imagesIndex]), 
      material1 = new THREE.MeshBasicMaterial({ map: texture1 }), 
      objectMesh = new THREE.Mesh(geometry, material1), 
      location3d = new THREE.Vector3(Math.random()* 500-250, Math.random()* 500-250, Math.random()* 500+120) 

     ]; 


     var overlapping = false; 
     for (var j = 0; j < objects.length; j++) { 
      var projectCubeLoc = objects[j][0][3]; 

了var otherCubesLoc = projectCubeLoc [J];生成錯誤

  var otherCubesLoc = projectCubeLoc[j]; 
      var distance = projectCubeLoc.distanceTo(otherCubesLoc); 
      console.log(distance); 

      if (distance < 150) { 
       overlapping = true; 
       break; 
      }; 
     }; 

放在語句的循環之外,因爲重疊是假的至少一個對象將在陣列中把

 if (!overlapping) { 
      objects.push(object); 
      imagesIndex++; 
     }; 
    }; 

,但現在我得到類型錯誤:無法讀取屬性「 0'的undefined

當我在瀏覽器中運行此代碼瀏覽器只是崩潰...我沒有得到任何錯誤消息的瀏覽器將只是崩潰並退出它自我... 我認爲它有一些東西用while循環做,但我無法形象出了什麼毛病...

任何幫助或提示,非常感謝!

,如果有更多的代碼需要,或者如果您想看到的jsfiddle只問:)

+0

任何人當您啓動循環中,'objects'數組爲空。所以你的'for'循環永遠不會運行。你的'for'循環內的代碼是唯一能夠將任何東西添加到'objects'數組中的東西。你有一個無限循環。 –

+0

沒有JavaScript應該使瀏覽器崩潰並突然退出。您的代碼中可能存在一個錯誤,但瀏覽器中也存在一個錯誤,並且行爲因瀏覽器而異(因此您應該說您使用的是哪個瀏覽器)。您也可以嘗試在代碼中的各個位置插入警報,以瞭解它在崩潰瀏覽器之前得到的距離。然後,您可以嘗試解決有問題的行(並可能向瀏覽器作者提交錯誤報告)。 –

回答

0
var images = ["image1.jpg", "image2.jpg", "image3.jpg", "image4.jpg", "image5.jpg", "image6.jpg", "image7.jpg", "image8.jpg"]; 
var objects = []; 

geometry = new THREE.BoxGeometry(100, 100, 100,10,10); 

while(objects.length < images.length) { 

    var imagesIndex = 0; 

    var object = {}; 
    object.texture1 = textureLoader.load("data/"+ images[imagesIndex]); 
    object.material1 = new THREE.MeshBasicMaterial({ map: object.texture1 }); 
    object.objectMesh = new THREE.Mesh(geometry, object.material1); 
    object.location3d = new THREE.Vector3(Math.random()* 500-250, Math.random()* 500-250, Math.random()* 500+120); 

    var overlapping = false; 
    for (var j = 0; j < objects.length; j++) { 
     var projectCubeLoc = objects[j].location3d; 
     var distance = projectCubeLoc.distanceTo(object.location3d); 

     if (distance < 150) { 
      overlapping = true; 
      break; 
     }; 
    }; 

    if (!overlapping) { 
     objects.push(object); 
     imagesIndex++; 
     object.objectMesh.position = object.location3d; 
     console.log(object.location3d); 
     scene.add(object.objectMesh); 
    }; 
}; 


console.log(objects); 

我用對象稱爲對象替換對象數組。這樣我就可以從對象中得到所需的數據,而不必處理0個未定義的錯誤。現在的偉大工程;)感謝所有幫助@Asad賈米爾希望這將有助於在未來:)

0

你並沒有使用任何的對象數組。

您的代碼永遠無法到達for循環中的objects.push調用。

您將數組初始化爲空,所以當它到達j == 0objects.length == 0以便循環不運行時。

0

我不確定你是否正在使用Unity3d,但當我嘗試執行C#代碼時,它發生在我身上。 實際上,你在循環中聲明瞭一個變量,並且每次更新它時總是將該變量的值設置爲零,使其成爲網格。

+0

我正在與一個叫做three.js的javascript庫文件一起工作 – FutureCake

+0

我對js並不瞭解,因爲上面提到的庫被使用了。但我分享了我的個人經驗。 –

0
  1. 作爲while(objects.length < images.length)循環開始,必須 空數組,其最初將通過,因爲 的objects此時長度短的圖像陣列。
  2. 當你前進時,你已經聲明新變量object,其中 應該被推送或添加到objects(我的假設 按照命名)。然後你是for (var j = 0; j <objects.length; j++)開始的for循環,這是使用 長度objects,尚未被初始化。整個功能在 。所以它永遠不會進入循環
  3. if(!overlapping){objects.push(object); imagesIndex ++;};這個聲明不能達成,因爲循環不會開始。

沒有值被推入到objects數組變量中,該數組變量繼而進入描述的第1點,並在您的函數中形成無限循環,反過來導致瀏覽器崩潰。

描述:隨着fundstion開始執行,'objects'的長度爲0,它的長度小於圖像的長度,這是一個有效的條件,但由於函數執行內部循環,那時變量的長度'對象'也是零,因爲你沒有在對象中增加值。那個時間objects.length是0。所以for循環沒有執行,並再次檢查while條件,此時'objects'的長度也爲零,有效的場景再次執行所有代碼行,如前所述,仍然for循環不會因爲沒有值在執行循環之前被添加到變量'objects'中。同樣的場景運行到無限。希望這將清除你所有的疑惑。

+0

謝謝你的解釋:)你能給我一個解決方案嗎?給我更多的見解?我對編程一般都很陌生......因爲我不能自己弄清楚這個問題:( – FutureCake

+0

@FutureCake你不能理解的東西嗎?你能描述一下嗎?就你想讓我放更多的東西? –

+0

你是什麼意思是:你有空數組,它會通過最初,因爲這個時間長度的對象是少了圖像數組。你最初意味着通過初始? – FutureCake

相關問題