问题:
在写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,问题解决。