zoukankan      html  css  js  c++  java
  • Cocos2d-x 3.0截屏功能集成

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

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

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

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

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

     1 void ScreenshotTest::saveImage(Ref *pSender){
     2     static int counter = 0;
     3      
     4     char png[20];
     5     sprintf(png, "image-%d.png", counter);
     6     char jpg[20];
     7     sprintf(jpg, "image-%d.jpg", counter);
     8      
     9    //截屏后的回调函数,这里显示在左下角
    10     auto callback = [&](const std::string& fullPath){
    11         auto sprite = Sprite::create(fullPath);
    12         CCASSERT(sprite!=nullptr, "Failed to create sprite.");
    13         addChild(sprite);
    14         sprite->setScale(0.3f);
    15         sprite->setPosition(Point(40, 40));
    16         sprite->setRotation(counter * 3);
    17         CCLOG("Image saved %s", fullPath.c_str());
    18     };
    19      
    20    //调用Director的截屏功能
    21     Director::getInstance()->saveScreenshot(png, callback);
    22     counter++;
    23 }
  • 相关阅读:
    扩展域并查集经典题
    2010提高组-C]关押罪犯(扩展域并查集
    [2015普及组-D]推销员 思维que
    The 2019 Asia Nanchang First Round Online Programming Contest C(cf原题,线段树维护矩阵)
    Fire-Fighting Hero(多源最短路和单源最短路)
    The Preliminary Contest for ICPC Asia Xuzhou 2019
    Cow Routing(最短路spfa)
    hdu6582
    ACM_题目这么难,来局愉快的昆特牌吧
    ACM_水题你信吗
  • 原文地址:https://www.cnblogs.com/atong/p/3642950.html
Copyright © 2011-2022 走看看