2011-01-23 61 views
1

好的,所以我的簡單碰撞檢測算法不起作用。它總是激活(除非玩家在他的x和/或y平原上沒有任何碰撞)。需要簡單碰撞檢測算法的幫助

嗯,這裏是代碼:

collisionCheck: function(bArray){ 
    for(var i = 0; i < bArray.length; i++){ 
     for(var j = 0; j < bArray[i].length; j++){ 
      if(bArray[i][j].getType() != 0){ 
       if((bArray[i][j].getX() > this.x && bArray[i][j].getX() < this.x + this.width) || 
        (bArray[i][j].getX() + blockSize > this.x && bArray[i][j].getX() + blockSize < this.x + this.width) && 
        (bArray[i][j].getY() > this.y && bArray[i][j].getY() < this.y + this.height) || 
        (bArray[i][j].getY() + blockSize > this.y && bArray[i][j].getY() + blockSize < this.y + this.height)){ 
        this.x = 0; 
       } 
      } 
     } 
    } 
} 

查看爲什麼它激活任何原因,當它不應該?

回答

0
function spritecollision(x1,y1,w1,h1,x2,y2,w2,h2){ 
    if(x2<(x1+w1)&&(x2+w2)>x1&&y2<(y1+h1)&&(y2+h2)>y1)return 1; 
} 

所以,如果你希望它永遠激活除非有一個碰撞,使用!spritecollision

來源:http://nextgengame.webs.com/fun.htm

編輯:這是最好的答案。這是完美的。

+0

從驗證您布爾邏輯獨立的,這是更短的和更好的:`返回X2 <(X1 + W1)&&(×2 + W2)> x1 && y2 <(y1 + h1)&&(y2 + h2)> y1;` – Phrogz 2011-01-23 20:13:05

2

試試這個:

collisionCheck: function(bArray){ 
    for(var i=0,len=bArray.length; i<len; ++i){ 
    for(var j=0,len2=bArray[i].length; j<len2; ++j){ 
     if(!bArray[i][j].getType()) continue; 
     var x = bArray[i][j].getX(), y = bArray[i][j].getY(); 
     var x2 = x+blockSize, y2 = y+blockSize; 
     var overlapping = (x2>this.x) && (x<(this.x+this.width)) && (y2>this.y) && (y<(this.y+this.height)); 
     if (overlapping) this.x = 0; // I don't know why you'd do this, but it's what you have 
    } 
    } 
    // Should this function return anything? 
} 

要回答你的問題,爲什麼你目前的邏輯是不正確的,讓我們關注的一個問題。你的邏輯說,基本上是有衝突,如果:

(YourLeftEdgeIsPastMyLeftEdge和YourLeftEdgeIsNotPastMyRightEdge) OR
((某物與某物)AND(某物與某物))
OR
(某物與某物)

中間線是因爲&&higher precedence而不是||,導致您的條件的中間兩行聚集在一起。

這樣看來,我們可以看到碰撞可以通過只檢查兩個項目的水平放置而成功,這顯然是一個錯誤。

我有我的答案的邏輯基本上是兩個物體做重疊,如果:

  • A.一個的右邊是對方的左邊緣的左側, OR
  • 一個
  • B的左邊緣至另一個的右邊緣的右側,OR
  • C.一項所述的底部邊緣是另一個的頂部邊緣上方,OR
  • D的一個的頂邊是b讓另一個的底部邊緣消失。

De Morgan's Laws!(A || B || C || D)相同(!A && !B && !C && !D),所以我們可以說,兩個物體重疊,如果:

  • A.一個的右邊緣到其他的左邊緣,AND
  • B.一個的左邊緣是到離開其他的右邊緣的,AND
  • C.一項所述的底部邊緣下面另一個的頂部邊緣,並且
  • D.頂部邊緣一個是以上另一個的底部邊緣。

並且這導致我提供的代碼:
(x2>this.x) && (x<(this.x+this.width)) && (y2>this.y) && (y<(this.y+this.height))