Cocos2d-x 3.0截屏功能集成

偶尔e网事2014-07-10 12:06:59249 次阅读

3.0的截屏和2.x的截屏基本上相同,都是利用RenderTexture来处理,在渲染之前调用call函数,然后调用Cocos的场景visit函数对其进行渲染,渲染结束后调用end函数即可。只是3.0截屏需要在截完屏的下一帧才能处理RenderTexture,这点要注意。


本文的重点在于如何将截图功能继承到Cocos2d-x 3.0引擎。


1.集成到Director

这里选择把截屏功能继承到Director中,让全局的导演来执行截屏功能是一个很好的主意。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void  Director::saveScreenshot( const  std::string& fileName, const  std::function< void ( const  std::string&)>& callback)  
{  
     Image::Format format;  
     //进行后缀判断  
     if (std::string::npos != fileName.find_last_of( "." )){  
         auto extension = fileName.substr(fileName.find_last_of( "." ),fileName.length());  
         if  (!extension.compare( ".png" )) {  
             format = Image::Format::PNG;  
         else  if (!extension.compare( ".jpg" )) {  
             format = Image::Format::JPG;  
         else {  
             CCLOG( "cocos2d: the image can only be saved as JPG or PNG format" );  
             return ;  
         }  
     else  {  
         CCLOG( "cocos2d: the image can only be saved as JPG or PNG format" );  
         return  ;  
     }  
    //获取屏幕尺寸,初始化一个空的渲染纹理对象  
     auto renderTexture = RenderTexture::create(getWinSize().width, getWinSize().height, Texture2D::PixelFormat::RGBA8888);  
    //清空并开始获取  
     renderTexture->beginWithClear(0.0f, 0.0f, 0.0f, 0.0f);  
    //遍历场景节点对象,填充纹理到RenderTexture中  
     getRunningScene()->visit();  
    //结束获取  
     renderTexture->end();  
    //保存文件  
     renderTexture->saveToFile(fileName , format);  
    //使用schedule在下一帧中调用callback函数  
     auto fullPath = FileUtils::getInstance()->getWritablePath() + fileName;  
     auto scheduleCallback = [&,fullPath,callback]( float  dt){  
         callback(fullPath);  
     };  
     auto _schedule = getRunningScene()->getScheduler();  
     _schedule->schedule(scheduleCallback,  this , 0.0f,0,0.0f,  false "screenshot" );  
}


2.如何使用saveScreenshot

截屏功能使用起来也很简单,直接调用saveSecreenshot,其中第一个参数为文件名(支持png和jpg格式,不带后缀名默认为png格式),第二个参数为回调函数,你可以在回调函数中处理这个文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void  ScreenshotTest::saveImage(Ref *pSender){  
     static  int  counter = 0;  
        
     char  png[20];  
     sprintf (png,  "image-%d.png" , counter);  
     char  jpg[20];  
     sprintf (jpg,  "image-%d.jpg" , counter);  
        
    //截屏后的回调函数,这里显示在左下角  
     auto callback = [&]( const  std::string& fullPath){  
         auto sprite = Sprite::create(fullPath);  
         CCASSERT(sprite!=nullptr,  "Failed to create sprite." );  
         addChild(sprite);  
         sprite->setScale(0.3f);  
         sprite->setPosition(Point(40, 40));  
         sprite->setRotation(counter * 3);  
         CCLOG( "Image saved %s" , fullPath.c_str());  
     };  
        
    //调用Director的截屏功能  
     Director::getInstance()->saveScreenshot(png, callback);  
     counter++;  
}


3.源码下载

该功能已提交pull request到Cocos2d-x Github上了,有需求的童鞋们可以自己集成了。

你可能感兴趣的:(Cocos2d-x 3.0截屏功能集成)