浏览器在运行我的代码时不断崩溃

时间:2016-08-29 16:43:12

标签: javascript while-loop three.js crash

我有以下代码:

Application

var otherCubesLoc = projectCubeLoc [j];生成错误

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

将语句放在for循环之外,因为重叠是false,至少有一个对象将被放入数组中

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

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

但现在我得到TypeError:无法读取属性&#39; 0&#39;未定义的

当我在浏览器中运行此代码时,浏览器崩溃...我没有收到任何错误消息,浏览器将崩溃并自行退出... 我认为它与while循环有关但我无法弄清楚出了什么问题......

非常感谢任何帮助或提示!

如果需要更多代码,或者如果您想查看jsfiddle,请询问:)

4 个答案:

答案 0 :(得分:0)

您没有为对象数组分配任何内容。

你的代码永远不会在你的for循环中到达你的objects.push。

您将数组初始化为空,因此当它到达for for look j == 0objects.length == 0时,循环就不会运行。

答案 1 :(得分:0)

我不确定你是否正在使用Unity3d但是当我尝试执行这样的C#代码时,它发生在我身上。     实际上你在循环中声明一个变量,每次更新它总是将该变量的值设置为零,使其成为一个网格。

答案 2 :(得分:0)

  1. while(objects.length < images.length)循环开始时,你有 空数组,最初会传递,因为这个时间长度为 objects少于图像数组。
  2. 当你前进的时候,你已经声明了新的变量object 应该被推送或添加到objects(我的假设 根据命名)。然后你for (var j = 0; j <objects.length; j++)启动for循环,这是使用 长度objects,尚未初始化。在里面 整体功能。所以它永远不会进入循环
  3. if(!overlap){objects.push(object); imagesIndex ++;};无法达到此声明,因为循环不会开始。
  4. 没有任何值被推入objects数组变量,而这又变为描述的第1点,并且会在函数中形成无限循环,从而导致浏览器崩溃。

    描述:当fucntion开始执行时,'对象'的长度为0并且它的长度小于图像的长度,这是一个有效的条件,但是当fucntion执行内部循环时,那个时间长度变量'objects'的变量也为零,因为您没有在对象中添加值。那个时候objects.length是0.所以for循环没有执行,再次检查条件,此时'对象'的长度也是零,有效的场景再次执行我前面描述的所有代码行,仍为循环因为在执行循环之前没有将值添加到变量'objects'中,所以不会进行调整。并且相同的场景运行无限。希望这能清除你所有的疑惑。

答案 3 :(得分: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);

我用一个名为object的对象替换了对象数组。这样我就可以从对象中获取数组中所需的数据,而不必处理0个未定义的错误。现在效果很好;)感谢所有的帮助@Asad Jamil希望这将有助于未来的任何人:)

相关问题