1

私はCでいくつかの衝突検出コードを書こうとしていました.以下は私が現時点で持っている関数です.フレームごとに呼び出されます.

short int Collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
{
    int left1, left2;
    int right1, right2;
    int top1, top2;
    int bottom1, bottom2;

    left1 = x1;
    left2 = x2;
    right1 = x1 + w1;
    right2 = x2 + w2;
    top1 = y1;
    top2 = y2;
    bottom1 = y1 + h1;
    bottom2 = y2 + h2;

    if ((bottom1 < top2)||(top1 > bottom2)||(right1 < left2)||(left1 > right2)) 
    {
        return(1);
    }

    else
    {
        return(0);
    }

    };

    if (Collision ==1)
    {
    //code for collision here
    }

正しい方向へのポインタは大歓迎です

4

2 に答える 2

1

32 個のタグと 16 個の演算子を持つ正しい単一の条件があることはわかっていますが、それを読み取ることは不可能であり、めちゃくちゃになりやすいです。私のアドバイスは次のとおりです。より多くの単純な条件を記述してください。

bool collision = false;
do {
  if (top1 > bottom2) break;  // 1 is under 2
  if (top2 > bottom1) break;  // 1 is beyond 2
  if (left1 > right2) break;  // 1 is right to 2
  if (left2 > right1) break;  // 1 is left to 2
  // I think we listed all the non-collide cases  
  collision = true;
} while (false);

「タッチ」が非衝突と見なされる場合は、代わりに >= を使用する必要があります > -s。優れたコンパイラは、これと長い複雑な条件から同じコードを生成するはずです。

于 2012-12-13T22:03:06.810 に答える
0

(0,0) 頂点は左上であり、左下ではないことに注意してください。したがって、y (垂直軸) は下に向かって増加し、x (水平軸) は右に向かって増加します。

したがって、bottom1 < top2衝突がなく、同様の条件が他の条件である場合、そこにあることを意味します

于 2012-12-13T21:38:42.513 に答える