6

我正在尝试在 Cocos2d-x 中移植像素完美碰撞检测,原始版本是为 Cocos2D 制作的,可以在这里找到:http: //www.cocos2d-iphone.org/forums/topic/pixel-perfect-collision-detection -使用颜色混合/

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

bool CollisionDetection::areTheSpritesColliding(cocos2d::CCSprite *spr1, cocos2d::CCSprite *spr2, bool pp, CCRenderTexture* _rt) {
    布尔 isColliding = false;
    CCRect交叉点;
    CCRect r1 = spr1->boundingBox();
    CCRect r2 = spr2->boundingBox();
    交点 = 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());

    // 寻找简单的边界框碰撞
    if ( ((intersection.size.width>0) && (intersection.size.height>0) ) {
        // 如果我们不检查像素完美碰撞,则返回 true
        如果(!pp){
            返回真;
        }

        无符号整数 x = 交叉点.origin.x;
        无符号整数 y = 交叉点.origin.y;
        无符号整数 w = 交叉点.大小.宽度;
        无符号整数 h = 交集.大小.高度;
        无符号整数 numPixels = w * h;
        //CCLog("X 和 Y 的交点 %d, %d", x, y);
        //CCLog("像素数%d", numPixels);

        // 绘制到 RenderTexture
        _rt->beginWithClear(0, 0, 0, 0);

        // 渲染两个精灵:第一个为红色,第二个为绿色
        glColorMask(1, 0, 0, 1);
        spr1->访问();
        glColorMask(0, 1, 0, 1);
        spr2->访问();
        glColorMask(1, 1, 1, 1);

        // 获取相交区域的颜色值
        ccColor4B *buffer = (ccColor4B *)malloc( sizeof(ccColor4B) * numPixels );
        glReadPixels(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, 缓冲区);

        _rt->end();

        // 读取缓冲区
        无符号整数步= 1;
        for(unsigned int i=0; i 0 && color.g > 0) {
                isColliding = true;
                休息;
            }
        }

        // 释放缓冲内存
        免费(缓冲区);
    }


    返回是碰撞;
}

如果我将“pp”参数发送为假,我的代码运行良好。也就是说,如果我只进行边界框碰撞,但在需要 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); //用于检测

我认为我在执行此 CCRenderTexture 时犯了一个错误

谁能指导我做错了什么?

感谢您的时间 :)

4

2 回答 2

3

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

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

于 2013-09-27T07:48:17.707 回答
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

于 2013-09-02T03:13:11.330 回答