사각 충돌

- Study 2007.03.08 21:15
사각형 충돌을 구현하려고 생각해보니 예전에 사용했던 코드가 생각나 끄적여 본다.

void IsCollisionRect(CRect *pRect,  CRect *pRect2)
{
  long minX = min(pRect->GetX(), pRect2->GetX());
  long maxX = max(pRect->GetX() + pRect->GetWidth(), pRect2->GetX()
    + pRect2->GetWidth());
  long minY = min(pRect->GetY(), pRect2->GetY());
  long maxY = max(pRect->GetY() + pRect->GetHeight(), pRect2->GetY()
    + pRect2->GetHeight());
 
  if (maxX - minX < pRect->GetWidth() + pRect2->GetWidth() &&
    maxY - minY < pRect->GetHeight() + pRect2->GetHeight())
  {
    return true;
  }
  return false;
}

먼저 두 사각형의 Left 좌표중 작은 값을 기억하고 Right 좌표중에 가장 큰 값을 기억한다.
(Right - Left)를 연산 한다. 이 값이 두 사각형의 Width를 합친 값보다 작으면 충돌이고
크면 충돌이 아니다.

역시 Top과 Bottom도 마찬가지다. 그림을 그리면서 써 놓고 싶지만 쉬운 식이므로 패스.
그래도 이해가 안된다면 자 생각해보자. 두 사각형의 Width 각각 100, 100 이라고 하자.
그럼 합은 200 일 것이다. 제일 작은 X 값과 제일 큰 X 값을 빼면 거리가 나올 것이다.

그럼 비교하면 땡! 너무 쉬운거라; 설명하기도 힘들다. 이런거 써 놓는 나도 참....
오랜만에 스프라이트 툴 만들면서 써봤는데... 그래도 두 사각형 좌표 막 비교하는 것 보다는
훨씬 유용한 것 같다. 이걸 어디서 책에서도 본 기억이 있는데;; 책 이름은 기억이 안난다.

from : http://charmzine.com/blog/charmzine/tag/%C3%E6%B5%B9


/////////////////////////////////////////////////////////////////////////

기존 프로젝트에서는 스프라이트데이터에서 충돌영역을 가져와
검사를 했지만 지금 진행중인건 속도 향상을 위해서
미리 객체의 넓이를 정하고 위의 코드로 충돌검사를 할거다.
왜? 내맘.~
신고
Posted by TrustMe™


티스토리 툴바