Cocos2dx中的像素完美碰撞检测

时间:2013-08-31 08:16:36

标签: c++ ios collision-detection cocos2d-x

我正在尝试在Cocos2d-x中移植像素完美碰撞检测原始版本是为Cocos2D制作的,可在此处找到:http://www.cocos2d-iphone.org/forums/topic/pixel-perfect-collision-detection-using-color-blending/

这是我的Cocos2d-x版本的代码

bool CollisionDetection::areTheSpritesColliding(cocos2d::CCSprite *spr1, cocos2d::CCSprite *spr2, bool pp, CCRenderTexture* _rt) {
    bool isColliding = false;
    CCRect intersection;
    CCRect r1 = spr1->boundingBox();
    CCRect r2 = spr2->boundingBox();
    intersection = CCRectMake(fmax(r1.getMinX(),r2.getMinX()), fmax( r1.getMinY(), r2.getMinY()) ,0,0);
    intersection.size.width = fmin(r1.getMaxX(), r2.getMaxX() - intersection.getMinX());
    intersection.size.height = fmin(r1.getMaxY(), r2.getMaxY() - intersection.getMinY());

    // Look for simple bounding box collision
    if ( (intersection.size.width>0) && (intersection.size.height>0) ) {
        // If we're not checking for pixel perfect collisions, return true
        if (!pp) {
            return true;
        }

        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;
        //CCLog("Intersection X and Y %d, %d", x, y);
        //CCLog("Number of pixels %d", numPixels);

        // Draw into the RenderTexture
        _rt->beginWithClear( 0, 0, 0, 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 = (ccColor4B *)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 0 && color.g > 0) {
                isColliding = true;
                break;
            }
        }

        // Free buffer memory
        free(buffer);
    }


    return isColliding;
}

如果我将“pp”参数发送为false,我的代码工作正常。也就是说,如果我只进行边界框碰撞,但是当我需要Pixel Perfect碰撞时,我无法正常工作。 我认为opengl掩码没有按照我的意图运行。

以下是“_rt”

的代码
    _rt = CCRenderTexture::create(visibleSize.width, visibleSize.height);
    _rt->setPosition(ccp(origin.x + visibleSize.width * 0.5f, origin.y + visibleSize.height * 0.5f));
    this->addChild(_rt, 1000000);
    _rt->setVisible(true); //For testing

我认为我在实施此CCRenderTexture时犯了一个错误

任何人都可以指导我做错的事吗?

感谢您的时间:)

2 个答案:

答案 0 :(得分:3)

终于解决了这个问题。 必须使用自定义opengl片段着色器将其中一个精灵完全遮蔽,另一个完全变为蓝色,然后循环浏览glReadPixels值以查找具有RED和BLUE像素的任何像素。 (也必须考虑混合,我们不想用另一个像素值替换)

深入的信息可以在我的博客文章中找到 http://blog.muditjaju.infiniteeurekas.in/?p=1

答案 1 :(得分:1)

您没有正确地通过缓冲区。

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

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

来源:http://www.cocos2d-iphone.org/forums/topic/pixel-perfect-collision-detection-using-color-blending/#post-337907