我最近使用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;对象未定义。在没有任何问题之前,我以非常简单的方式使用过这种代码。任何人都可以帮助我吗?
抱歉我的英语不好。
答案 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();
}
}