2011-01-23 11 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

EDIT:これが最良の答えです。それは完璧だ。

+0

、これが短いと良いです: 'リターン×2 <(X1 + W1)&&(×2 + W2)> x1 && y2 <(y1 + h1)&&(y2 + h2)> y1; ' – Phrogz

+0

いいえ、私はNumber型でのみ動作します。ブーリアンが必要なのは誰ですか?これは私の機能で、私は自分のサイトで使っています。 –

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
(何かと何かが)

&&が一緒に凝集するためにあなたの状態の真ん中の2行を引き起こし、 ||より higher precedenceを持っているので、

真ん中のラインがあります。

これを見ると、明らかに間違いである2つのアイテムの水平配置のみをチェックすることで衝突が成功することがわかります。

私は私の答えを持っているロジックは、2つのオブジェクトが行うことを基本的にない重なっている場合:

  • A. 1の右端が他の左端の左側にあります、 OR
  • B.一方の左端は、他の右端の右、OR
  • C. 1つの下縁が他方の上端より上にある、OR
  • さD.ザ1の上端がbもう一方の下端を下にしてください。 1の右端が右にある

    • A.:

    De Morgan's Laws!(A || B || C || D)(!A && !B && !C && !D)と同じで、私たちは次の場合に二つのオブジェクトオーバーラップを行うことを言うことができると言います他方の左端の、および

  • B。一方の左端があるまで、他の右端の、AND
  • C.一方の下端がその他の上端以下れ、
  • D.上端を左の1つはの上にあり、他の下端はです。

そして、これは私が供給コードになります:
あなたのブール論理の検証とは別に (x2>this.x) && (x<(this.x+this.width)) && (y2>this.y) && (y<(this.y+this.height))