【问题标题】:Cocos2D 2.0 screenshots on iOS 6iOS 6 上的 Cocos2D 2.0 截图
【发布时间】:2012-09-13 19:30:03
【问题描述】:

我有一个应用程序可以截取场景并将其保存到文件中。我有这个工作,应用程序在商店里。今天,我已经下载了 iOS 6,但我使用的方法不再有效。我测试了我所知道的一切以使其正常工作,谷歌搜索并发现了这个:

http://www.cocos2d-iphone.org/forum/topic/37809?replies=22#post-180983

用户似乎同意这适用于 iOS 5,但我已经在 iOS 6 上进行了测试,它正在生成黑色屏幕截图。

我不是 Cocos2D 方面的专家,所以我不能确切地说出这个人的代码有什么问题。作者在 github 上有一个示例项目,甚至他的项目也在 iOS 6 上生成黑色屏幕截图。

有什么线索吗?谢谢。

谢谢

【问题讨论】:

  • 对于 cocos2D 中的问题,我没有直接的解决方案,但我可以分享一下,我在 iOS6 和直接 OpenGL 屏幕抓取中遇到了同样的问题。问题不是 cocos2D 特有的。
  • 这与问题Why is glReadPixels() failing in this code in iOS 6.0? 相关,这是因为iOS 现在在从帧缓冲区读取像素后,在将其呈现到屏幕后不返回任何内容。 Apple 已经警告说这是一段时间以来不受支持的行为,看起来他们终于采取了行动。
  • 我明白了。谢谢。幸运的是,Ben 给出的解决方案正在奏效。顺便说一句,布拉德,我们想念你在 iTunesU 上的教程...... ????
  • 对不起,问题中发布的链接现在似乎无效...

标签: iphone ios ipad cocos2d-iphone


【解决方案1】:

我不确定 GitHub 版本的功能,但这段代码会截取屏幕截图,我刚刚在 iOS 6 上对其进行了测试,它运行良好。

+(UIImage*) screenshotWithStartNode:(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];
}

你可以这样称呼它

CCScene *scene = [[CCDirector sharedDirector] runningScene];
CCNode *n = [scene.children objectAtIndex:0];
UIImage *img = [AppController screenshotWithStartNode:n];

【讨论】:

  • 谢谢,但据我所知,这将生成不在视网膜大小上的屏幕截图,因为您将纹理的大小定义为 winSize 而不是 winSizeInPictures...
  • CCRenderTexture 为您处理。它的纹理大小是点而不是像素。这段代码确实在 Retina 大小下截屏,我刚刚测试过。
  • anddd 我的奥斯卡太棒了.. @BenTrengrove :) 谢谢你救了我的一天 ;)
  • 是cocos2d 2.0上CCRenderTexture的方法。
  • 我已经实现了代码,但是截图不是很清晰,有点模糊。
【解决方案2】:

这里适用于 Cocos2d V3。

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

    CGSize viewSize = [[CCDirector sharedDirector] viewSize];
    CCRenderTexture* rtx =
    [CCRenderTexture renderTextureWithWidth:viewSize.width
                                     height:viewSize.height];
    [rtx begin];
    [startNode visit];
    [rtx end];

    return [rtx getUIImage];
}

【讨论】:

    【解决方案3】:

    以上 2 个答案在 Cocos2d 3.2.1 中不起作用

    这里是Cocos2d 3.2.1 +的解决方案

    -(UIImage*) takePresentScreenshot
    {
        [CCDirector sharedDirector].nextDeltaTimeZero = YES;
    
        CGSize size = [[CCDirector sharedDirector] viewSize];
        CCRenderTexture *renderTxture = [CCRenderTexture renderTextureWithWidth:size.width
                                                                      height:size.height];
        [renderTxture begin];
        [[[CCDirector sharedDirector] runningScene] visit];
        [renderTxture end];
    
        return [renderTxture getUIImage];
    }
    
    UIImage* screenshot = [self takePresentScreenshot];
    

    【讨论】:

      【解决方案4】:

      最佳答案适用于 iPad(我已经在 iPad v1 到 4 上进行了测试)。

      它不适用于实际设备:iPhone5、iOS7。

      但是,它确实适用于这样的 iPhone 5 的模拟器!

      这种不一致快把我逼疯了!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多