cocos2d study #16

충돌 체크


충돌 체크가 필요한 이유

충돌 체크는 게임 내의 캐릭터 또는 물체들의 영역이 서로 겹치는지 확인하는 것이다.

왜 이런 확인이 필요할까? 슈팅 게임을 예로 들어보겠다.

플레이어가 미사일을 발사한 상황을 가정하자. 플레이어가 정확하게 조준을 하고 발사했다면, 미사일은 적 기체를 향해 이동할 것이고 결국 적기와 미사일은 서로 겹치는 순간이 오게 된다. 아무런 처리를 하지 않았다면 미사일은 적기를 관통해 버릴 것이다.

미사일이 적기와 닿은 순간을 확인하는 것이 바로 충돌 체크라고 할 수 있다. 이 순간을 확인하여 미사일과 적기를 폭발(제거)시키거나, 적기의 에너지를 줄이는 등의 처리가 필요한 것이다.

충돌 체크 방법

사각형 영역 검사

여러 가지 방법이 있겠지만 간단히 사각형(Rectangle)의 영역을 비교하는 메소드를 이용하면 충돌 체크를 쉽게 확인할 수 있다. 단, 이 방법에는 심각한 단점이 있는데, 물체의 크기가 커질수록 충돌 여부가 애매한 상황이 생긴다. 예를 들어 300x300 크기를 갖는 삼각형 형태의 비행체가 있을 때, 삼각형을 감싸는 사각형의 빈 영역과 다른 커다란 물체가 근접했을 뿐 실제로는 겹치지 않았는데도 충돌한 상황이 생긴다. 그렇기 때문에 사각형 영역 검사 방법은 각 물체의 크기를 너무 크지 않게 하는 것이 중요하다.


CGRectIntersectsRect

CGRectIntersectsRect를 이용하여 두 객체의 rect를 비교하면 된다.

rect가 겹칠 경우 TRUE를 리턴한다.

// 영역 겹침 검사 ////////////////////////
-(void)testCollision {

    if (CGRectIntersectsRect(playerRect, enemyRect)) {
        // playerRect, enemyRect 두 영역을 검사해서 겹치면 TRUE, 아니면 FALSE 리턴
    }

    // 비슷한 메소드로 r1, r2가 겹쳐진 부분의 영역을 리턴하는 CGRectIntersection이 있다.
    // CGRectIntersection(CGRect r1, CGRect r2)
}

CGRectContainesPoint

터치를 한 좌표가 rect 영역 안에 있는지 확인한다. 영역 안이라면 TRUE를 리턴한다.

// 터치 포인트가 영역 안에 속하는가 /////////////
-(void)testTouch {

    if (CGRectContainsPoint)(playerRect, touchPoint) {
        // touchPoint가 playerRect 영역 안에 있는지 검사. 있으면 TRUE 리턴
    }
}


'개발 > Cocos2d' 카테고리의 다른 글

아이폰 게임 Hello Space 개발 #02  (0) 2012.11.01
아이폰 게임 Hello Space 개발 #01  (0) 2012.11.01
cocos2d study #15  (0) 2012.10.26
cocos2d study #14  (0) 2012.10.26
cocos2d study #13  (0) 2012.10.26

+ Recent posts