截图与CCClippingNode - cocos2d-iphone-2.1-beta4

时间:2013-01-12 10:19:43

标签: ios objective-c cocos2d-iphone screenshot

我正在测试在Cocos2d 2.1 beta4 CCClippingNode中添加的新剪辑节点。但是,我无法使用以下方法截取剪切节点的屏幕截图。最终结果是未剪辑的图像。您可以在此处找到新版本:http://www.cocos2d-iphone.org/download

+ (UIImage *) screenshotNode:(CCNode*)startNode {
    [CCDirector sharedDirector].nextDeltaTimeZero = YES;

    CGSize winSize = [CCDirector sharedDirector].winSize;

    CCRenderTexture * rtx = [CCRenderTexture renderTextureWithWidth:winSize.width height:winSize.height];

    [rtx begin];
    [startNode visit];
    [rtx end];

    return [rtx getUIImage];
}

2 个答案:

答案 0 :(得分:4)

建议的解决方案

以下代码似乎适用于Cocos2d v2.1:

+ (UIImage *) screenshotNode:(CCNode*)startNode {
    [CCDirector sharedDirector].nextDeltaTimeZero = YES;

    CGSize winSize = [CCDirector sharedDirector].winSize;

    CCRenderTexture * rtx =
        [CCRenderTexture renderTextureWithWidth:winSize.width
                                         height:winSize.height
                                    pixelFormat:kCCTexture2DPixelFormat_RGBA8888
                             depthStencilFormat:GL_DEPTH24_STENCIL8];

    [rtx beginWithClear:0 g:0 b:0 a:0 depth:1.0f];
    [startNode visit];
    [rtx end];

    return [rtx getUIImage];
}

<强>解释

为了使原始代码有效,需要进行以下两项更改:

  1. 创建depthStencilFormat对象时指定CCRenderTexture参数。默认情况下,CCRenderTexture不会创建深度/模板缓冲区。
    • depthStencilFormat参数必须设置为GL_DEPTH24_STENCIL8才能创建模板缓冲区,至少在v2.1中。 CCRenderTexture初始化代码专门检查此值。
  2. 使用深度值beginWithClear而不是1.0f来呼叫begin
    • 看来只是调用begin永远不会清除深度缓冲区。在CCClippingNode内,使用glDepthMask(GL_FALSE)禁用写入深度缓冲区,但仍启用深度测试。由于深度缓冲区永远不会被清除,我怀疑深度测试失败了,导致模板永远不被绘制。
  3. 此外,必须使用CCGLView创建depthFormat:GL_DEPTH24_STENCIL8_OES,以便CCClippingNode首先使用模板。

答案 1 :(得分:0)

问题是我没有正确设置我的CCGLView。我必须将深度格式设置为GL_DEPTH24_STENCIL8_OES而不是值0

在AppController.mm中设置depthFormat

enter image description here