我创建对象的for循环不能在.js中使用P5

时间:2017-05-23 17:23:13

标签: javascript p5.js

我最近使用P5来制作类似Flappy的游戏,直到一天前,我曾经为我的游戏定义和调用我的对象:

    function setup(){
    //**Define**
      cloud1 = new Cloud(random(100, windowHeight - 500), random(0.7, 1.3));
      cloud2 = new Cloud(random(100, windowHeight - 500), random(0.7, 1.3));
    };

    function draw(){
    //**Draw Clouds**
      cloud1.show();
      cloud2.show();
    };

这很好用,但是当我尝试以下列方式使用for循环时:

    function setup(){
    //**Define**
      for(var i = 0; i < 5; i++) {
        cloud[i] = new Cloud(random(100, windowHeight - 500), random(0.7, 1.3));
      }
    }

    function draw
    //**Draw Clouds**
      for(var i = 0; i < 5; i++) {
        cloud[i].show();
      }
    }

调试人员说我的云计算是&#39;对象未定义。在没有任何问题之前,我以非常简单的方式使用过这种代码。任何人都可以帮助我吗?

抱歉我的英语不好。

3 个答案:

答案 0 :(得分:1)

var cloud=[];//must be global
function setup(){
  for(var i = 0; i < 5; i++) {
    cloud[i] = new Cloud(random(100, windowHeight - 500), random(0.7, 1.3));
  }
}

function draw(){
  for(var i = 0; i < cloud.length; i++) {//better like this
    cloud[i].show();
  }
}

如果必须可以通过两个函数访问它,则需要将变量放在更高的范围内,并且可以迭代cloud.length元素,因为更改时可以监视硬编码值。

此外,在这种情况下(不在P5中)我的首选设置是这样的:

function setup(num){
  var cloud=[];
  for(var i = 0; i < num; i++) {
    cloud[i] = new Cloud(random(100, windowHeight - 500), random(0.7, 1.3));
  }
  cloud.show=function(){
      this.forEach(el=>el.show());
  };
  return cloud;
}

所以你可以这样做:

clouds=setup(5);
clouds.show();

答案 1 :(得分:1)

首先,让我们谈谈为什么会这样做:

function setup(){
   myVariable = 'hello';
}

function draw(){
   console.log(myVariable);
}

在这里,您使用赋值运算符为变量赋值。

这是有效的,因为当您点击myVariable = 'hello';行时,JavaScript会在扩大范围时查找名为myVariable的变量(首先在setup()函数中,然后在全局范围内)。当它没有找到具有该名称的变量时,它会在全局范围内创建一个新变量。关于here的更多信息。

现在,让我们谈谈为什么没有工作:

function setup(){
   myArray[0] = 'hello';
}

function draw(){
   console.log(myArray[0]);
}

在这里,您使用索引运算符索引名为myArray的数组。但是,该变量尚未创建!您可以先创建数组:

function setup(){
   myArray = [];
   myArray[0] = 'hello';
}

function draw(){
   console.log(myArray[0]);
}

这与您的第一个代码工作原理相同。 myArray = []行首先查找名为myArray的变量,然后在无法找到它时创建一个新变量。

但是,以上所有内容都是非常糟糕的代码,因为它依赖于JavaScript来查看各种范围。如果已经有myVariable变量怎么办?您现在正在覆盖该值,这可能导致错误的行为。至少,这是一种意想不到的副作用,所以应该避免。

相反,您要做的是使用var关键字自行声明变量。由于您想要访问两个函数中的变量,您希望在两个函数之外执行此操作,如下所示:

var myArray = [];

function setup(){
   myArray[0] = 'hello';
}

function draw(){
   console.log(myArray[0]);
}

现在,此代码创建一个名为myArray的变量,并将其设置为等于空数组。然后,您可以使用它上面的索引运算符来设置单个索引,您可以在多个函数中访问它。更好的是,如果与另一个变量发生冲突,你会收到一个错误警告你。

答案 2 :(得分:-2)

您需要先创建空数组,然后才能分配它的元素。

最好在使用它们之前声明变量。

var cloud;

function setup(){
  //**Define**
  cloud = [];
  for(var i = 0; i < 5; i++) {
    cloud[i] = new Cloud(random(100, windowHeight - 500), random(0.7, 1.3));
  }
}

function draw
  //**Draw Clouds**
  for(var i = 0; i < 5; i++) {
    cloud[i].show();
  }
}