【玩转cocos2d-x之三十九】Cocos2d-x 3.0截屏功能集成
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截屏功能集成的更多相关文章
- VS2010/MFC编程入门之三十九(文档、视图和框架:概述)
前面几节讲了菜单.工具栏和状态栏的使用,鸡啄米本节开始将为大家讲解文档.视图和框架的知识. 文档.视图和框架简介 在VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)创建的单文档工 ...
- Qt浅谈之三十九圆形进度条(已经有50篇了)
http://blog.csdn.net/taiyang1987912/article/category/2314763
- Java经典编程题50道之三十九
写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. public class Example39 { public static void main(String[] a ...
- ABP框架系列之三十九:(NLayer-Architecture-多层架构)
Introduction Layering of an application's codebase is a widely accepted technique to help reduce com ...
- 潭州课堂25班:Ph201805201 django 项目 第十九课 文章主页数据库模型,前后台功能实现 (课堂笔记)
-数据库模型设计 : 文章:新闻表: 字段:图片,标题,摘要,类型,作者,创建时间 标签表 评论表, 轮播图:外键,指向文章的外键表 在 utls 目录下创建 models.py 把其它模型常用的字 ...
- Android Multimedia框架总结(二十五)MediaProjection实现手机截屏(无须root)
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53966818 前言:一年半多以前 ...
- 菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章
菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章 cheungmine, 2014-10-26 在上一章中,我们准备好了计算机和软件.本章开始部署hadoop 高可用集群. 2 部署 ...
- bp(net core)+easyui+efcore实现仓储管理系统——入库管理之三存储过程(三十九)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- Citrix服务器虚拟化之三十 XenApp 6.5发布流式应用程序
Citrix服务器虚拟化之三十 XenApp 6.5发布流式应用程序 XenApp可发布以下类型的资源向用户提供信息访问,这 ...
随机推荐
- 定义序列化器时的read_only和write_only选项
# 转载请留言联系 read_only read_only表示只能读,不能进行修改.例如定义序列化器时,id字段通常指定read_only=True.在序列化时,即对象转为字典.JSON字符串时,字典 ...
- 《锋利的JQuery》读书要点笔记1——认识JQuery&&选择器
<锋利的jQuery>源码下载,包括了这本书中全部代码以及用到的CSS文件 第一章 认识jQuery jQuery是个Js库.首先该明确的一点是:在jQuery库中$就是jQuery的一个 ...
- VS2010编写C++程序出现error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”?
用VS2010编写C++程序,编译时出现如下错误: 修改方法: 右击项目,选择属性 点击确定,重新编译,错误解决.
- hdu 2236(二分图最小点覆盖+二分)
无题II Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 自定义的一个JDBC工具类
package JDBCutils; import java.io.File;import java.io.FileInputStream;import java.sql.Connection;imp ...
- [jquery] ajax 调试
$.ajax({ type: ‘post’, url: url, data: {code: ‘15′}, dataType: ‘jsonp’, sccuess:function(data){ aler ...
- CF A.Mishka and Contest【双指针/模拟】
[链接]:CF/4892 [题意]: 一个人解决n个问题,这个问题的值比k小, 每次只能解决最左边的或者最右边的问题 解决了就消失了.问这个人能解决多少个问题. [代码]: #include<b ...
- JVM的内存布局
JVM的内存布局包括,其中: Java虚拟机在执行Java程序的过程中会把它所管理的内存(线程相关?)划分为若干个不同的数据区域.有些区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结 ...
- [九省联考2018]林克卡特树(DP+wqs二分)
对于k=0和k=1的点,可以直接求树的直径. 然后对于60分,有一个重要的转化:就是求在树中找出k+1条点不相交的链后的最大连续边权和. 这个DP就好.$O(nk^2)$ 然后我们完全不可以想到,将b ...
- [CF494D]Birthday
题意:给一棵带边权的树,定义如下的一些东西 $S(x)$表示以$x$为根的子树中的节点组成的集合 $d(u,v)$表示$u$和$v$之间的距离 $f(u,v)\sum\limits_{x\in S(v ...