2014-11-04 40 views
0

美好的一天,每個人。Javascript(EaselJS) - 敵人同時具有相同的功能?

我想用javascript開發道奇遊戲。

我該如何解決我創建的所有3個敵人都具有相同功能的部分?我希望他們分開。因爲他們三人都應該走向敵人的結局1();

這是我用來創造敵人的代碼行。

var item: 
var enemy; 
var enemys = new Array(); 
function createEnemy(){ 
enemy = new createjs.Shape(); 
enemy.graphics.beginFill("black").drawRect(0, 0, 10, 10); 
enemy.x = (Math.random() * 400) +1; 
enemy.y = 50 
stage.addChild(enemy); 
enemys.push(enemy); 
console.log(enemys) 
} 

createEnemy(); 
createEnemy(); 
createEnemy(); 



function enemyforloop(){ 
for(var i=0;i<enemys.length;i++) { 
item = enemys[i]; 
enemyMove(); 
}} 

enemyforloop處於Ticker方法。 Enemymove是一個旨在使敵人向一個方向移動的功能。當它達到某個特定的位置後,它會被放入隨機的位置,然後繼續。

function enemyMove(){ 
if(enemyrandom == 1) 
{ 
item.y -= enemyspeed; 
    if(item.y < -10) 
    { 
     enemyrandom1(); 
    } 
} 

function enemyrandom1(){ 

enemyrandom = Math.floor((Math.random() * 4) + 1); 
enemyspeed = Math.random() *2 + 1; 

if(enemyrandom == 1){ 
    item.y = 300; 
    item.x = Math.floor((Math.random() * 400) + 1);  
} 
} 

我跳過敵人和敵人2,3,4,所以它不會佔用更多的空間。 我希望我的問題清楚。

這是它看起來像現在http://jsfiddle.net/HqYeD/411/

回答

0

只需擺脫全局enemyspeedenemyrandom並將這些變量的範圍限制在每​​個敵人。

function createEnemy() { 
    enemy = new createjs.Shape(); 
    enemy.graphics.beginFill("black").drawRect(0, 0, 10, 10); 
    enemy.x = (Math.random() * 400) +1; 
    enemy.y = 5; 

    // scope direction and speed to each enemy 
    enemy.enemyspeed = Math.random() *2 + 1; 
    enemy.enemyrandom = Math.floor((Math.random() * 4) + 1); 

    stage.addChild(enemy); 
    enemys.push(enemy); 
    console.log(enemys) 
} 

改變你在此基礎上的代碼,其餘...

function enemyMove() { 
    if(item.enemyrandom == 1) { // use scoped direction 
     item.y -= item.enemyspeed; // use scoped speed 
     if(item.y < -10) 
     { 
      enemyrandom1(); 
     } 
    } 
    // .... 
} 

同樣...

function enemyrandom1() { 

    item.enemyrandom = Math.floor((Math.random() * 4) + 1); 
    item.enemyspeed = Math.random() *2 + 1; 

    if(item.enemyrandom == 1){ 
     item.y = 300; 
     item.x = Math.floor((Math.random() * 400) + 1);  
    } 
    // .... 
} 
+0

我試過了,它工作。謝謝。我仍然試圖瞭解我做錯了什麼。所以我不會重複同樣的錯誤。永遠不會想到這個解決方案。但它的確很有意義。謝謝你。 – user1978133 2014-11-06 19:27:11

0

你作用域在全球範圍內的「項目」(類似你貼在CreateJS社區最初的例子,你的範圍,在全球的「敵人」範圍也是如此),所以你有同樣的問題。

相反,item應該聲明的功能,並傳遞到「enemyMove」的方法:

function enemyforloop(){ 
    for(var i=0;i<enemys.length;i++) { 
     var item = enemys[i]; // NOTE THE VAR USED HERE! 
     enemyMove(item); // ITEM IS PASSED IN HERE! 
    } 
} 
function enemyMove(item){ 
    // This code should not need to change. 
} 

確保你在你的代碼的頂部去掉「VAR項目」。你應該只聲明這樣的事情,在他們的壽命期間不需要改變。您的enemyitem對象是暫時的,並且經常更改。

希望這會有所幫助。

+0

讀你的解釋後。我知道我錯了哪裏。然而你的解決方案並沒有爲我工作。我本來可能做錯了。謝謝。 – user1978133 2014-11-06 19:29:04

+0

隨時分享您的解決方案! – Lanny 2014-11-07 23:43:20

相關問題