关于 Cocos2d-x 3.x+截屏功能

来源:互联网 发布:unix 网络编程 源代码 编辑:程序博客网 时间:2024/06/05 02:45

问题:

在写cocos2d-x截屏功能的时候遇到了一个问题。

虽然调用了 Director::getInstance()->getRunningScene(); 但是并没有获取到当前Scene。

出现如图类似情况。


C++代码如下:

void SocialUtils::screenshot()
{
    int h = Director::getInstance()->getWinSize().height;
    int w = Director::getInstance()->getWinSize().width;
    int o_y = Director::getInstance()->getVisibleOrigin().y;
    int o_x = Director::getInstance()->getVisibleOrigin().x;
    CCLOG("w:%d--h:%d",w,h);
     //定义一个屏幕大小的渲染纹理
    RenderTexture *renderTexture = RenderTexture::create((int)(w*0.85), (int)(h*0.85), Texture2D::PixelFormat::RGBA8888);
    
    Scene* getscene = Director::getInstance()->getRunningScene();
    cocos2d::Point ancPos = getscene->getAnchorPoint();
    
    cocos2d::Rect fullRect;
    fullRect.setRect(o_x,o_y,w,h);
    cocos2d::Rect virtualViewPort;
    virtualViewPort.setRect(o_x,o_y,w,h);
    renderTexture->setVirtualViewport(Vec2(o_x+w*0.18,o_y+h*0.2),fullRect,virtualViewPort);
    //渲染纹理开始捕捉
    renderTexture -> beginWithClear(0.0f, 0.0f, 0.0f, 0.0f);
    //绘制当前场景
    getscene-> visit();
    renderTexture -> end();
     //保存png
    renderTexture -> saveToFile(StringUtils::format("screenshot.png"),Image::Format::PNG,true,[=](RenderTexture*,const std::string& m_path)

{

//保存完毕之后的回调

std::string path = FileUtils::getInstance()->getWriteablePath();

});

解决方法:

创建renderTexture的时候得调用 
RenderTexture * RenderTexture::create(int w ,int h, Texture2D::PixelFormat eFormat, GLuint uDepthStencilFormat)

然后,指定最后一个参数为: 
GL_DEPTH24_STENCIL8 

将其改为:

RenderTexture *renderTexture = RenderTexture::create((int)(w*0.85), (int)(h*0.85), Texture2D::PixelFormat::RGBA8888,GL_DEPTH24_STENCIL8);


OK,问题解决。

0 0