CODEONWORT

사각형 집단 사이의 충돌 검사 본문

Season 1/플래시

사각형 집단 사이의 충돌 검사

codeonwort 2010.12.19 21:06

이 방법은 복잡한 충돌 검사 알고리즘을 쓰지 않고 플래시에 내장된 사각형 충돌 검사만을 이용하기 때문에 싸게 먹히며 사용하기도 쉽다.

게임을 만든다거나 할 때, 그냥 캐릭터 자체를 충돌 검사에 쓰는 것보다는 캐릭터 안에 사각 영역을 넣고 안 보이게 한 다음, 이 영역을 충돌 검사에 쓰는 것이 좋다.

(귀검사는 공개된 일러스트 따라 그린 거고 고블린은 던파 꺼)

하지만 공격 영역과 피격 영역을 그냥 사각형 하나로 만들면 실제로 의도한 영역을 잘 표현할 수 없는 경우가 많다. 캐릭터의 동작은 다양하고 사각형 하나로 덮기에는 빈 공간이 많은 경우가 잦다.

(던파 꺼)

이럴 때 한 사각형 대신 여러 사각형을 쓰면 영역을 좀 더 정교하게 지정할 수 있다.
(계산을 줄이는 방법이 하나 있는데, 여러 사각형을 덮는 큰 사각형을 하나 만들고 큰 사각형들끼리 충돌 검사한다. 충돌하지 않았으면 안의 작은 사각형들끼리도 충돌하지 않으므로 넘어가고, 충돌하면 작은 사각형들끼리 충돌 검사한다.)


충돌 검사를 정말로 정확하게 해야 한다면 픽셀 완전 충돌 검사를 써야겠지만 격투 게임이 아닌 이상 그런 정확도가 필요할까? 이 정도로도 충분할 것이다.

그리고 이렇게 여러 사각형을 썼을 때 충돌 검사를 편리하게 하기 위한 편의 메서드가 필요하다. 두 무비클립 a, b 안에 여러 사각형이 들어 있을 때 multiHitTest(a, b) 식으로 써서 충돌 검사를 하는 것이 좋겠다고 생각하여 이것을 클래스로 작성했다. 자기 사정에 맞게 패키지도 넣고 클래스랑 메서드 이름도 바꿔서 쓰면 된다.
소스 코드는 MIT 라이센스 하에 배포


예제

stage.addEventListener("mouseMove", smm)
function smm(e:MouseEvent):void {
    a.x = mouseX ; a.y = mouseY
    if(HitTest.test(a, b)) a.alpha = 0.5
    else a.alpha = 1
}

 

충돌 검사에 쓸 무비클립을 편의상 a라고 부르자. a의 내부에 사각형을 여러 개 그리고 각 사각형을 무비클립으로 만들면 된다. 단, 사각형 하나만 쓰고 싶으면 a의 내부에 그냥 사각형을 하나 그리고 무비클립으로 만들지 않아도 된다. 만들어도 작동은 하지만 쓸데 없는 수고다.
0 Comments
댓글쓰기 폼