2016-08-29 3 views
0

Ich habe den folgenden Code:Browser abstürzt hält, wenn ich meinen Code ausführen

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]; 

die var otherCubesLoc = projectCubeLoc [j]; generiert die Fehler

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

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

die Anweisung außerhalb der for-Schleife gelegt, da überlappende falsch ist zumindest ein Objekt in dem Array

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

gesetzt werden wird, aber ich Typeerror bekommen: Lesen Eigenschaft kann nicht '

Wenn ich diesen Code im Browser ausführen, stürzt der Browser einfach ab ... Ich bekomme keine Fehlermeldungen, der Browser wird einfach abstürzen und es selbst beenden ... ich denke, es hat etwas zu tun mach mit der While-Schleife, aber ich kann nicht sehen heraus, was falsch ist ...

jede Hilfe oder Tipps werden sehr geschätzt!

wenn es mehr Code erforderlich oder wenn Sie einen jsfiddle sehen möchten einfach fragen :)

+0

Wenn Sie die Schleife starten, ist das 'Objekte' Array leer. So läuft deine 'for'-Schleife nie. Der Code innerhalb der 'for'-Schleife ist das einzige, was dem' objects'-Array etwas hinzufügt. Du hast eine Endlosschleife. –

+0

Kein Javascript sollte jemals einen Browser zum Absturz bringen und plötzlich beenden. Es könnte einen Fehler in Ihrem Code geben, aber es gibt auch einen Fehler in Ihrem Browser, und das Verhalten variiert von Browser zu Browser (Sie sollten also sagen, welchen Browser Sie verwenden). Sie können auch versuchen, Warnungen an verschiedenen Stellen in Ihrem Code einzufügen, um herauszufinden, wie weit es kommt, bevor der Browser abstürzt. Dann können Sie versuchen, die problematische Linie zu umgehen (und vielleicht einen Fehlerbericht mit den Browser-Autoren einzureichen). –

Antwort

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); 

Ich ersetzte das Objektarray durch ein Objekt namens object. Auf diese Weise konnte ich die gewünschten Daten von Objekten aus dem Array holen, ohne mit 0 von undefinierten Fehlern umgehen zu müssen. es funktioniert jetzt super;) Danke für all die Hilfe @Asad Jamil hoffe, das wird jedem in der Zukunft helfen :)

0

Sie sind nicht alles auf das Array-Objekte zuweisen.

Ihr Code erreicht niemals Ihre Objekte.Push-Aufruf in Ihrer for-Schleife.

Sie initialisieren das Array als leer, so dass, wenn es für Look j == 0 und objects.length == 0 auf die bekommt so die Schleife nicht ausgeführt.

0

Ich bin mir nicht sicher, ob Sie mit Unity3d arbeiten, aber es ist mir einmal passiert, als ich versucht habe, einen solchen Code von C# auszuführen. Eigentlich deklarieren Sie eine Variable innerhalb der Schleife, und jedes Mal, wenn sie aktualisiert wird, setzt sie immer den Wert dieser Variablen auf Null, wodurch sie zu einem Netz wird.

+0

Ich arbeite mit einer JavaScript-Bibliothek namens three.js – FutureCake

+0

Ich bin neu zu js und nicht bewusst, für was diese oben genannte Bibliothek verwendet wird. Aber ich habe meine persönliche Erfahrung geteilt. –

0
  1. Als while(objects.length < images.length) Loop-Start, haben Sie leeres Array, das zunächst passieren, weil diese Zeitlänge die objects die Array Bilder weniger ist.
  2. Wie Sie vorwärts gehen, haben Sie neue Variable object, die soll geschoben oder hinzugefügt werden in die objects (Meine Annahme gemäß der Benennung). und dann sind Sie for (var j = 0; j <objects.length; j++) Starten der For-Schleife, die die Länge von objects verwendet, die noch nicht initialisiert wird. In der ganze Funktion. es wird also nie in die Schleife eintreten
  3. if (! überlappend) {objects.push (object); imagesIndex ++;}; Diese Aussage kann nicht erreicht werden, da loop nicht gestartet wurde.

keine Werte werden in die Variable objects Array geschoben, die wiederum zu dem Punkt gehen 1 der Beschreibung und der in Ihrer Funktion eine Endlosschleife bilden, die wiederum bewirkt, dass der Browser abstürzt.

Beschreibung: als fucntion beginnt Ausführung Länge 0 ‚Objekte‘, und es ist weniger die Länge des Bildes, das ein gültiger Zustand, sondern als fucntion führt die innere Schleife, dass die Zeit die Länge des Variable ' Objekte 'ist auch Null, da Sie keinen Wert im Objekt hinzugefügt haben. Zu dieser Zeit ist objects.length 0.so für Schleife nicht ausgeführt und wieder geht zu überprüfen, während Bedingung, zu diesem Zeitpunkt 'Objekte' Länge ist auch Null, gültig Szenario wieder die gesamte Codezeile wie ich vorher beschrieben, noch für Schleife wird nicht tun, weil keine Werte wurden vor der Ausführung der Schleife in die Variable 'objects' eingefügt. und dasselbe Szenario läuft bis unendlich. Ich hoffe, dies wird alle Zweifel beseitigen.

+0

danke für die Erklärung :) Könnten Sie mir eine Lösung geben? um mir mehr Einblick zu geben? Ich bin ziemlich neu im Programmieren im Allgemeinen ... weil ich nicht wirklich herausfinden kann es selbst :( – FutureCake

+0

@FutureCake was Sie nicht in der Lage zu verstehen? Können Sie beschreiben, auf whcih Teil Sie wollen mich Licht mehr setzen? –

+0

was tun Sie mean by: Sie haben ein leeres Array, das anfänglich übergeben wird, weil diese Zeitlänge der Objekte weniger ist als die Bilder Array Was meinst du genau mit pass initally – FutureCake

Verwandte Themen