3.0的截屏和2.x的截屏基本上同样。都是利用RenderTexture来处理,在渲染之前调用call函数,然后调用Cocos的场景visit函数对其进行渲染,渲染结束后调用end函数就可以。仅仅是3.0截屏须要在截完屏的下一帧才干处理RenderTexture,这点要注意。关于2.x的RenderTexture的API和demo能够參见http://blog.csdn.net/jackystudio/article/details/15498083

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

1.集成到Director

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

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

截屏功能使用起来也非常easy,直接调用saveSecreenshot,当中第一个參数为文件名称(支持png和jpg格式,不带后缀名默觉得png格式),第二个參数为回调函数,你能够在回调函数中处理这个文件。

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上了,有需求的童鞋们能够自己集成了。源代码详细能够參见:https://github.com/cocos2d/cocos2d-x/pull/5978

【玩转cocos2d-x之三十九】Cocos2d-x 3.0截屏功能集成的更多相关文章

  1. VS2010/MFC编程入门之三十九(文档、视图和框架:概述)

    前面几节讲了菜单.工具栏和状态栏的使用,鸡啄米本节开始将为大家讲解文档.视图和框架的知识. 文档.视图和框架简介 在VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)创建的单文档工 ...

  2. Qt浅谈之三十九圆形进度条(已经有50篇了)

    http://blog.csdn.net/taiyang1987912/article/category/2314763

  3. Java经典编程题50道之三十九

    写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. public class Example39 {    public static void main(String[] a ...

  4. ABP框架系列之三十九:(NLayer-Architecture-多层架构)

    Introduction Layering of an application's codebase is a widely accepted technique to help reduce com ...

  5. 潭州课堂25班:Ph201805201 django 项目 第十九课 文章主页数据库模型,前后台功能实现 (课堂笔记)

    -数据库模型设计 : 文章:新闻表: 字段:图片,标题,摘要,类型,作者,创建时间 标签表 评论表, 轮播图:外键,指向文章的外键表 在 utls 目录下创建 models.py  把其它模型常用的字 ...

  6. Android Multimedia框架总结(二十五)MediaProjection实现手机截屏(无须root)

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53966818 前言:一年半多以前 ...

  7. 菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章

    菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章 cheungmine, 2014-10-26 在上一章中,我们准备好了计算机和软件.本章开始部署hadoop 高可用集群. 2 部署 ...

  8. bp(net core)+easyui+efcore实现仓储管理系统——入库管理之三存储过程(三十九)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  9. Citrix服务器虚拟化之三十 XenApp 6.5发布流式应用程序

                                        Citrix服务器虚拟化之三十 XenApp 6.5发布流式应用程序   XenApp可发布以下类型的资源向用户提供信息访问,这 ...

随机推荐

  1. intValue()的用法

    今天看到了Integer的这个方法,有点疑惑,查了下,做下笔记; 1.intValue()是java.lang.Number类的方法,Number是一个抽象类.Java中所有的数值类都继承它.也就是说 ...

  2. python encode和decode函数说明

    字符串编码常用类型:utf-8,gb2312,cp936,gbk等. Python中,我们使用decode()和encode()来进行解码和编码 在python中,使用unicode类型作为编码的基础 ...

  3. Selenium2+python自动化59-数据驱动(ddt)【转载】

    前言 在设计用例的时候,有些用例只是参数数据的输入不一样,比如登录这个功能,操作过程但是一样的.如果用例重复去写操作过程会增加代码量,对应这种多组数据的测试用例,可以用数据驱动设计模式,一组数据对应一 ...

  4. PEP 3106 -- Revamping(改进) dict.keys(), .values() and .items()

    1. Abstract(摘要) This PEP proposes(建议) to change the .keys(), .values() and .items() methods of the b ...

  5. java 获取当前系统时间

    Java的Date获取时间函数都是deprecated 可以使用: https://stackoverflow.com/questions/5175728/how-to-get-the-current ...

  6. (十四)基于GTID的主从复制

    (1)GTID主从复制 1)环境介绍 /etc/redhat-release CentOS Linux release 7.3.1611 (Core) MySQL版本:5.7 mysql> se ...

  7. PowerDesigner用例图展示设置

    powerdesigner用例图显示设置 powerdesigner中的绘图功能真是不敢恭维,折线半天弄不直,直线半天弄不弯. 1.修改显示设置 tools-->display preferen ...

  8. bisect二分查找模块使用

    import bisectL = [1, 3, 3, 6, 8, 12, 15]x = 5x_insert_point = bisect.bisect_left(L, x)# 在L中查找x,x存在时返 ...

  9. mysql:把DB1中A表a字段替换为DB2中B表b字段

    UPDATE DB1.A SET a = ( SELECT b FROM DB2.B WHERE B.Id = A.id) 实例: UPDATE wordpress.`wp_posts` SET po ...

  10. centos 7下查找大文件、大目录和常见文件查找操作

    根据园子 潇湘隐者的文章 <Linux如何查找大文件或目录总结>结合实际运维需要整理出常用命令 目标文件和目录查找主要使用 find 命令 结合 xargs (给命令传递参数的一个过滤器, ...