ios - Cocos2d:일괄 처리 된 스프라이트의 완벽한 픽셀 충돌



cocos2d-iphone collision-detection (0)

Daniel Vilchez가 개발 한 픽셀 완벽한 충돌 알고리즘을 발견 했으며이 cocos2d-iphone.org 포럼 주제에서 공유 프로젝트에 포함되었습니다.

아래에는 내가 관심있는 알고리즘의 일부가 있습니다. 코드를 원래대로 CCRenderTexture 사용할 때마다 응용 프로그램이 추락했기 때문에이 수정하려고합니다.

나는 원의 충돌에 기반을 둔 대안적인 방법을 생각하고있다. 그러나 그것들은 "픽셀이 완벽하지 않다."그리고 나의 총알 이이 모양 의 물결 인 경우에는 잘 작동하지 않을 것이다.

** 나는 알고리즘을 CCSpriteBatchNode에서 배치 된 스프라이트와 함께 작동시키는 방법을 얻고 싶습니다. 그렇다면 CCRenderTexture의 사용이 엄격히 포함됩니까? **

정확하게 말하자면,이 질문은 부분적으로 내 다른 질문 과 관련 이 있습니다. CCRenderTexture 인스턴스를 만들면 내 앱이 중단됩니다. 나는 알고리즘에 대해 물어 보았 기 때문에 다른 두 가지를 게시합니다. 다른 알고리즘에서는 CCRenderTexture가 왜 내 응용 프로그램을 (Daniel의 픽셀 완벽한 알고리즘을 사용하지 않고 충돌하지만 CCRenderTexture의 인스턴스를 만드는) 이유를 묻습니다.

적용된 코드 (CCRenderTexture가 없어서 내 응용 프로그램이 손상되어 CCRenderTexture의 _rt - 인스턴스 사용}를 주석 처리했습니다.) 코드가 제대로 작동하지 않아 CCRenderTexture가 필요하다고 생각하여 질문을 던졌습니다.

-(BOOL) isPixelPerfectCollisionBetweenSpriteA:(CCSprite*)spr1 spriteB:(CCSprite*) spr2
{
    BOOL isCollision = NO; 
    CGRect intersection = CGRectIntersection([spr1 boundingBox], [spr2 boundingBox]);

    // Look for simple bounding box collision
    if (!CGRectIsEmpty(intersection))
    {
        // Get intersection info
        unsigned int x = intersection.origin.x;
        unsigned int y = intersection.origin.y;
        unsigned int w = intersection.size.width;
        unsigned int h = intersection.size.height;
        unsigned int numPixels = w * h;

        //NSLog(@"\nintersection = (%u,%u,%u,%u), area = %u",x,y,w,h,numPixels);

        // Draw into the RenderTexture
        //[_rt beginWithClear:0 g:0 b:0 a:0];

        // Render both sprites: first one in RED and second one in GREEN
        glColorMask(1, 0, 0, 1);
        [spr1 visit];
        glColorMask(0, 1, 0, 1);
        [spr2 visit];
        glColorMask(1, 1, 1, 1); 

        // Get color values of intersection area
        ccColor4B *buffer = malloc( sizeof(ccColor4B) * numPixels );
        glReadPixels(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

        //[_rt end];

        // Read buffer
        unsigned int step = 1;
        for(unsigned int i=0; i<numPixels; i+=step)
        {
            ccColor4B color = buffer[i];

            if (color.r > 0 && color.g > 0)
            {
                isCollision = YES;
                break;
            }
        }

        // Free buffer memory
        free(buffer);
    }

    return isCollision;

편집 : 나는 또한 KKPixelMaskSprite 발견하지만 그것은 CCSpriteBatchNodes (여기 코멘트를 참조하십시오)에서 일괄 고해상도 스프라이트에 대해 작동하지 않는 것.





pixel