2017-05-23 22 views
0

我最近使用P5做出笨鳥先飛喜歡的遊戲,直到一個小時前我曾經定義和調用我的對象我這樣的比賽:我的for循環中創建對象的心不是工作名爲.js與P5

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

調試器說,我的「雲」的對象的心不是定義。我以前用過類似的方式使用過這種代碼,沒有任何問題。誰能幫我?

對不起,我的英語不好。

+1

你在哪裏定義'cloud'變量? –

+0

相關:https://stackoverflow.com/questions/1470488/what-is-the-purpose-of-the-var-keyword-and-when-to-use-it-or-omit-it –

回答

-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(); 
    } 
} 
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 beeing)我的首選設置會是這樣:

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(); 
+0

我知道你'只是建立OP的代碼,但請注意'setup()'是一個預定義的P5.js函數,不應該帶任何參數或返回任何東西。 –

+0

@KevinWorkman謝謝,不知道... –

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變量,並將其設置等於空數組。然後,您可以使用索引運算符來設置單個索引,並且可以使用多個函數來訪問它。更好的是,如果與另一個變量發生衝突,你會得到一個錯誤警告你。