반응형

 

이번에는 RECT 충돌 방법에 대해 알아보려고 한다.

 

일반적으로 타일 방식 맵을 사용하는 게임에서 사각형 충돌을 많이 사용한다.

 

가장 기초가 되는 충돌 방식이고 이를 응용하여 다양한 충돌 방식을 생각해볼 수도 있다.

 

 

 

위 이미지는 사각형 충돌이 다양한 형태로 발생할 수 있다는 것을 보여준다.

 

초록색 사각형이 캐릭터이고 빨간색 사각형이 장애물이라 가정해보자.

 

캐릭터는 밑으로 부딪힐 수도 있고 좌우 혹은 위로 부딪힐 수가 있다.

 

이것을 어떻게 처리해야 모든 충돌 조건을 처리할 수 있을까?

 

그전에 RECT의 기본 속성부터 알아보자. RECT 속성은 4개가 존재한다. (LEFT, TOP, RIGHT, BOTTOM)

 

LEFT(X1)은 사각형의 왼쪽 모서리를 의미한다.

TOP(Y1)은 사각형의 위쪽 모서리를 의미한다.

RIGHT(X2)는 사각형의 오른쪽 모서리를 의미한다.

BOTTOM(Y2)는 사각형의 아래쪽 모서리를 의미한다.

 

초록색 사각형의 특정 모서리가 빨간색 사각형의 특정 모서리를 넘어서는지 조건을 비교하여 충돌 처리 함수를 만들 수가 있다.

 

C++에서는 IntersectRect() 함수를 제공해주어서 편리하지만, 자바에서는 아쉽게도 직접 만들어써야한다.

 

아래는 두개의 사각형을 비교하는 충돌 처리 함수이다.

 

public static boolean IsIntersect(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
{
        if(x1 + w1 >= x2 && x1 <= x2 + w2 && y1 + h1 >= y2 && y1 <= y2 + h2)
        {
            return true;
        }

        return false;
 }

 

함수 인수를 RECT 속성으로 나열해버려서 그런지 조금 복잡해보이는 감이 있지만, 코드 자체는 무진장 간단하다.

 

조건식을 풀어보면, 아래와 같다.

 

아래 조건 하나하나 위의 그림 충돌 상태에도 적용이 되는지 확인해보자.

 

1. 첫번째 사각형의 오른쪽 모서리가 두번째 사각형의 왼쪽 모서리를 넘어야 한다.

2. 첫번째 사각형의 왼쪽 모서리가 두번째 사각형의 오른쪽 모서리를 넘지 않는다.

3. 첫번째 사각형의 아래쪽 모서리가 두번째 사각형의 위쪽 모서리를 넘어야 한다.

4. 첫번째 사각형의 위쪽 모서리가 두번째 사각형의 아래쪽 모서리를 넘지 않는다.

 

맨 위의 그림 4개를 보면 위 조건 4개가 모두 만족하여 true를 반환하게 된다.

 

그 외의 조건은 당연히 충돌되지 않으므로 false를 반환하게 된다.

 

반응형

+ Recent posts