开发中我们常会用到截图,下面比较一下

Cocos2d-x 2.x版本与3.x版本屏幕截图的两种方式:

(1)使用RenderTexture:这是在2.x版本时最常用的的截图方法。

(2)使用utils::captureScreen() :在3.2版本中新增的截图方法。

RenderTexture

RenderTexture这个动态纹理类,顾名思义就是可以动态创建纹理图片。

屏幕截图主要步骤:

开始截图:render->begin();

遍历场景:scene->visit();

结束截图:render->end();

保存截图:render->saveToFile(string& filename, Image::Format format);

其中Image::Format为图片格式,可以保存为PNG、或JPG两种格式。即:Image::Format::PNG、Image::Format::JPG。

1、截图方法

void HelloWorld::capture(Ref* sender)

{

CCLOG("ScreenShot");

//获取屏幕尺寸大小

Size winSize = CCDirector::sharedDirector()->getWinSize();

//创建RenderTexture,纹理图片大小为窗口大小winSize

RenderTexture* screen = RenderTexture::create(winSize.width, winSize.height);

//屏幕截图

screen->begin(); //开始抓屏

this->getParent()->visit(); //遍历当前场景Scene的所有子节点信息,画入screen中

screen->end(); //结束抓屏

//保存截图

screen->saveToFile("ScreenShot.png", Image::Format::PNG); //保存为PNG格式

//screen->saveToFile("ScreenShot.jpg", Image::Format::JPG); //保存为JPG格式

}

2、保存路径

Win32:保存在 Debug.win32/ 目录下。

Android:保存在 /data/data/com.summer.hello/files/ScreenShot.png 。

utils::captureScreen

在v3.2版本,utils::captureScreen()方法被加入用于保存屏幕截图。

1、定义

// afterCaptured:该方法将在捕捉指令后被执行。

// bool: 捕捉屏幕截图是否成功。

// string: 截图存储的路径。

// filename:截图的名字。

// 可以只是一个文件名。像这样ScreenShot.png。

// 也可以是一个绝对路径。像这样/sdcard/ScreenShot.png。

void captureScreen(const std::function& afterCaptured, const std::string& filename)

2、截图方法

//屏幕截图

void HelloWorld::capture(Ref* sender)

{

CCLOG("ScreenShot");

utils::captureScreen(CC_CALLBACK_2(HelloWorld::afterCapture, this), "ScreenShot.png");

}

//截图后执行afterCapture

void HelloWorld::afterCapture(bool succeed, const std::string& outputFile)

{

if (succeed)

{

CCLOG("%s", outputFile.c_str());

//显示截图

Sprite* sp = Sprite::create(outputFile);

sp->setPosition(winSize / 2);

this->addChild(sp);

sp->setScale(0.25); //放缩

}

else

{

CCLOG("Capture screen failed.");

}

}

3、保存路径

filename可以只是一个文件名(保存到相对路径):像这样 "ScreenShot.png"。

filename也可以是一个绝对路径:像这样 "/sdcard/ScreenShot.png"。