Cocos2D에서 임의의 사용자가 그린 모양과의 충돌을 어떻게 확인합니까?


10

스프라이트와 일종의 사용자 생성 모양 사이의 충돌을 감지하고 싶습니다.

예를 들어. 화면에는 3 개의 물체가 있습니다. 사용자는 손가락을 잡고 2 개의 물체 주위에 비정상적인 모양을 그립니다. 그 두 물체를 감지해야합니다.

녹색으로 된 게임 오브젝트와 자주색으로 사용자 모양

Cocos2D를 사용하여 어떻게 효율적으로 접근합니까?

답변:


10

해당 특정 예에 대한 매우 쉬운 솔루션이 있습니다.

나는 당신의 임의의 모양이 단지 일련의 포인트라고 가정합니다.

각 물체에서 어떤 방향 으로든 광선을 그립니다. 셰이프의 선 세그먼트와 교차하는 횟수가 짝수 (0 포함)이면 셰이프 외부에있는 것입니다.

교차 횟수가 홀수이면 객체 내부에있는 것입니다.

레이 / 라인 세그먼트 충돌은 찾기 / 구현하기 매우 쉬운 알고리즘입니다.


3

물론, 내 게임 스타 캐치 (Star Catch)에 대해 알아 내야했습니다. 더 나은 방법이있을 수 있지만 이것이 내가 한 방법입니다. 실제로 알고리즘을 온라인에서 발견했습니다 (죄송합니다 소스를 기억할 수 없습니다) 다각형 내부의 점을 검색하려고 검색했습니다.

요점을 지키기 위해 NSMutableArray를 만들었습니다. 터치 이벤트에 포인트를 추가합니다.

- (BOOL) testNodeInLoop:(CCNode *)node {

    CGPoint prev;

    // This is more accurate point for the node
    CGPoint absPoint = [node convertToWorldSpace:CGPointZero];

    float x = absPoint.x;
    float y = absPoint.y;

    BOOL isIn = NO;

    CGPoint cp;

    for(int i = 0, j = [points count] - 1; i < [points count]; j = i++) {
        [[points objectAtIndex:i] getValue:&cp];
        [[points objectAtIndex:j] getValue:&prev];

        if( ((cp.y > y) != (prev.y > y)) && (x < (prev.x -cp.x) * (y - cp.y) / (prev.y - cp.y) + cp.x)) {
            isIn = !isIn;
        }
    }
    return isIn;
}

도움이되는지 알려주세요.



0

픽셀 별 충돌 검사의 경우 XNA 개발자 사이트에 유용한 자습서 시리즈가 있습니다.
http://creators.xna.com/en-US/tutorial/collision2dperpixeltransformed

해당 자습서에서 사용되지 않은 한 가지 최적화 (이상하게도)는 대부분의 경우 개요 만 확인하면 소중한주기를 절약 할 수 있다는 것입니다 .

다음과 같이 수정했습니다 : 답변이 많고 질문을 잘못 읽었습니다. 픽셀 당 콜레트를 읽으려면 튜토리얼이 여전히 괜찮습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.