cocos2d和glReadPixels不起作用?

时间:2013-01-25 12:02:49

标签: cocos2d-iphone

我遇到cocos2d和glReadPixels的问题,因为无法正常工作。 我在网上找到了一个像素完美碰撞的代码,我修改了我的应用程序,但动画或更快的动画不起作用。

这是代码:

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

// Look for simple bounding box collision
if (!CGRectIsEmpty(intersection))
{
    // If we're not checking for pixel perfect collisions, return true
    if (!pp) {return YES;}

    // 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);

    /******* All this is for testing purposes *********/


    // Draw the intersection rectangle in BLUE (testing purposes)


    /**************************************************/

    [_rt end];

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

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

    // Free buffer memory
    free(buffer);
}

return isCollision;

// Look for simple bounding box collision if (!CGRectIsEmpty(intersection)) { // If we're not checking for pixel perfect collisions, return true if (!pp) {return YES;} // 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); /******* All this is for testing purposes *********/ // Draw the intersection rectangle in BLUE (testing purposes) /**************************************************/ [_rt end]; // Read buffer unsigned int step = 1; for(unsigned int q=0; q<1; q+=step) { ccColor4B color = buffer[q]; if (color.r > 0 && color.g > 0) { isCollision = YES; break; } } // Free buffer memory free(buffer); } return isCollision;

问题出在哪里?我试过但没有。

非常感谢你。 问候。

1 个答案:

答案 0 :(得分:0)

如果您使用的是iOS6,请查看this post以获得解决方案:

CAEAGLLayer *eaglLayer = (CAEAGLLayer *) self.layer;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithBool:YES],
                                    kEAGLDrawablePropertyRetainedBacking,
                                    kEAGLColorFormatRGBA8,        kEAGLDrawablePropertyColorFormat,
                                    nil];

解释是iOS6修复了iOS Open GL实现中的一些错误,因此每次将GL缓冲区呈现给屏幕时都会(正确)清除它。 Here what Apple writes about this

  

重要提示:在调用EAGLContext / -presentRenderbuffer之前,必须调用glReadPixel:获取定义的结果,除非您使用保留的后台缓冲区。

正确的解决方案是在渲染缓冲区显示到屏幕之前调用glReadPixels。之后,它失效了。

上述解决方案只是一种解决方法,可以使图像变为“粘性”。

请注意,它会影响您的应用呈现效果。关键是,如果您使用的是cocos2d,则在呈现渲染缓冲区之前无法轻松调用glReadPixels

希望它有所帮助。