2013-05-17 26 views
1

我是JavaScript和HTML新手,正在開發一款小遊戲。將數組內的值彼此進行比較

我有四個「敵人」在畫布上的位置由這些值中的陣列「enemyX」「enemyY」確定。

非常簡單,我想檢測敵人是否有'碰撞',即相互移動了30px(敵人圖像是30px 30px)。

我想要做的就是減去個值的價值同一陣列與其它數值數組中,看看這個值是小於30 。小於部分是一個if語句,那麼我該如何在沒有多行代碼的情況下將所有值相減?

這是我基於下面的答案已經嘗試:

var count = 0; 
var innercount = 0; 

while (count <= 3) { 

    while (innercount<=3) { 
     collisionDetect(count, innercount, enemyX[count], enemyY[count], enemyX[innercount], enemyY[innercount]) 
     innercount++ 
    } 
    count++  
} 

var i = 0; 
while (i < enemyX.length) { 

    if (collisionX[i] == 1) { 
     directionX = directionX*-1; 
    } 

    if (collisionY[i] == 1) { 
     direction = directionY*-1; 
    } 
} 


} 



} 

function collisionDetect(count, innercount, x, y, xX, yY) { 


if ((Math.abs(x-xX)) <=30) { 
    collisionX[count] = 1 
    collisionX[innercount] = 1 
} 

if ((Math.abs(y - yY)) <=30) { 
    collisionY[count] = 1 
    collisionY[innercount] = 1 
} 

return collisionX, collisionY; 
} 

此代碼給了我一張空白的畫布。

+0

考慮澄清你的問題。添加一些代碼可以幫助我們正確回答你的問題。 –

+0

是'enemyX'和'enemyY'位於敵方物體的中心嗎? –

+0

您可以使用jsfiddle輕鬆分享您的代碼。 – specialscope

回答

0

據我下面你的問題的理解是我的解決方案:

我認爲你需要找到兩個點之間的距離。通過使用距離,你可以運用你的邏輯。 要查找距離以下爲下式:

鑑於兩個點(X1,Y1)和(X2,Y2), 這些點之間的距離由下式給出:

enter image description here

+0

謝謝。我想我無法在這個問題上澄清這一點。我的主要問題是沒有找到對象之間的距離。我想找到一種方法來比較每個對象與其他對象。 –

1

你可以使用一個功能:

function colliding(x1, y1, x2, y2){ 
    return Math.abs(x1-x2) <= 30 && Math.abs(y1-y2) <= 30; 
} 

然後使用函數來測試敵人的不同組合:(1,2),(1,3),(1,4),(2,3),( 2,4)和(3,4)。

因此,例如,您可以使用:colliding(enemyX[2], enemyY[2], enemyX[3], enemyY[3])來檢查敵方2和3是否發生碰撞。用上面的所有組合來做到這一點。

編輯:以使其更可讀的,則可以定義一個額外的功能:

function enemiesColliding(e1, e2){ 
    return colliding(enemyX[e1], enemyY[e1], enemyX[e2], enemyY[e2]) 
} 

,然後使用它:

enemiesColliding(1,2) || enemiesColliding(1,3) || enemiesColliding(1,4) || 
enemiesColliding(2,3) || enemiesColliding(2,4) || enemiesColliding(3,4) 
+2

'abs'不是有效的javascript代碼。你的意思是'Math.abs'。 –

+0

@gfcarv:很好的抓住:-)我有很久沒有用過JS了! – Eduardo

+0

這不考慮角落,例如A的左上方碰撞B的右下角。 –

1

檢測的交點的兩個對象之間(假設矩形形狀)並且位置定義了對象的中心。

function getRect(x, y, w, h) 
{ 
    var left = x - Math.floor(w/2), 
    top = y - Math.floor(h/2); 

    return { 
     left: left, 
     top: top, 
     right: left + w, 
     bottom: top + h 
    }; 
} 

function intersects(A, B) 
{ 
    return A.right >= B.left && 
     A.left <= B.right && 
     A.bottom >= B.top && 
     A.top <= B.bottom; 
} 

alert(intersects(getRect(12, 56, 30, 30), getRect(30, 40, 30, 30))); // true 

getRect()函數可以被修改以適應用於不同的錨的位置,例如左上方。

+0

對不起,我很新。左邊,左邊,上邊,上邊等是什麼意思? –

+0

這些是JavaScript中對象聲明的一部分,屬性名稱後面跟着冒號和值。 –

1

我要重申我對你的理解問題,只是爲了沒有混淆。 您有兩個並聯的陣列,一個用於x線,另一個用於y線。每艘船在兩個陣列中都有一個元素。

因此,例如,可以在xPos [12]和yPos [12]找到12號船,其中xPos和yPos是上面的數組。

這也是理由,這是一個溝通。如果船舶[a]與船舶碰撞[b],則船舶[b]與船舶[a]相撞。我認爲這對於3艘船來說是成立的。

我會先寫一個距離函數。

dist(x1,y1,x2,y2) 
{ 
    return Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); 
} 

然後我會編寫通過數組運行的代碼。每個元素必須與其他元素進行一次比較。

var counter = 0; 
var indexOfShipThatHaveCollided = []; 
while(counter < Xpos.length) 
{ 
     var innerCounter = counter;   
     while(innerCounter < Xpos.length) 
     { 
      t = dist(Xpos[counter],Ypos[counter],Xpos[innerCounter],Ypos[innerCounter]) 
      if(t < 30) 
      { 
       indexOfShipThatHaveCollided.push(counter) 
       indexOfShipThatHaveCollided.push(innerCounter) 

      } 
     } 

} 

上面的代碼將每艘船舶與其他所有船隻進行比較。 它會比較船舶[1]和船舶[8],但不會比較船舶[8]和船舶[1]。

我沒有測試任何此代碼,但我希望它能讓您朝着正確的方向前進。 如果您有任何問題,請給我評論。

+0

看來這個代碼也會將敵人[1]和敵人[1]進行一次比較,給出值0.任何解決方法? –

+0

@ user2392394:是的,使用'var innerCounter = counter + 1'。 – Eduardo

+0

@Eduardo:謝謝,但是如果counter = 2,那麼innercounter只會取值3.我還希望innercounter爲1,以便比較所有值。 –