在Cocos2d-X 3.x里面,已经集成了截屏功能,单独放在utils命名空间里,实现在base/ccUtils.h文件里面。看下函数申明

  

/** Capture the entire screen
* To ensure the snapshot is applied after everything is updated and rendered in the current frame,
* we need to wrap the operation with a custom command which is then inserted into the tail of the render queue.
* @param afterCaptured, specify the callback function which will be invoked after the snapshot is done.
* @param filename, specify a filename where the snapshot is stored. This parameter can be either an absolute path or a simple
* base filename ("hello.png" etc.), don't use a relative path containing directory names.("mydir/hello.png" etc.)
* @since v3.2
*/
    简单看下,就是自定义一个渲染命令,加入到渲染队列尾部。
    函数参数有两个,,第一个是截屏完成后的操作函数回调,一个事自定义的截屏图片名字。
    回调函数有两个固定参数,一个是 bool型,用来判断截屏是否成功,另外一个是filename,实际上就是第二个参数会传入该回掉函数。
void captureScreen(const std::function<void(bool, const std::string&)>& afterCaptured, const std::string& filename);   有一个很重要的问题就是:上面函数的参数filename需要加上图片格式,例如:screenshot.png。因为,在函数实现内部使用过后缀来确定保存类型的,这个略坑,建议使用jpg,毕竟图片会小很多。

  我的工程是直接用的helloword,在helloscene上添加一个label,用来做截屏点击按钮,效果如图:

  

  现在呢,对于Capture这个label来说,我们有两种方法给他添加响应函数,

  1、把这个label加入menu,这样可以很简单的添加回掉函数,这种方法很通用,就不细说了。

  2、另一种就是使用触摸点击来给这个label添加响应函数。

  首先,需要添加一个aftercapture函数,在这个函数里面呢,将截屏的图片显示出来,具体做法就是重新创建一个scene,将图片放上去,通过导演切换到这个scene。看代码:

void HelloWorld::afterCaptureScreen(bool issuccess, const std::string &filename) //这个函数参数是固定的,不能写错了
{
auto size = Director::getInstance()->getWinSize();
if (issuccess)
{
auto scene = Scene::create();
auto sp = Sprite::create(filename); sp->setScale(0.8f);
sp->setPosition(Vec2(size.width/, size.height/));
scene->addChild(sp); auto lb = LabelTTF::create();
lb->setString("capture success!");
lb->setColor(ccc3 (, , ));
lb->setFontSize();
lb->setAnchorPoint(Vec2(0.5f, 1.0f));
lb->setPosition(Vec2(size.width/, size.height));
scene->addChild(lb); Director::getInstance()->replaceScene(scene);
}
else
{
auto scene = Scene::create(); auto lb = Label::create();
lb->setString("Capture Failed!");
lb->setTextColor(ccc4(, , , ));
lb->setPosition(Vec2(size.width / , size.height/));
scene->addChild(lb); Director::getInstance()->replaceScene(scene);
}
}

  接下来再添加一个函数,用于在在Capture这个label的touch ended里面调用,代码如下:

void HelloWorld::capturesc(std::string &filename)
{
Director::getInstance()->getTextureCache()->removeTextureForKey(filename); //这里最好加上这句,因为如果你需要重复点击这个按钮进行截屏操作的话,TextureCache里面不清除,会导致截屏失败
utils::captureScreen(CC_CALLBACK_2(HelloWorld::afterCaptureScreen, this), filename); //在这里调用cocos2d已经实现好的captureScreen函数,将我们写好的aftercapture函数和我们需要的图片名称穿进去,图片名称的初始化必须在这个函数调用之前完成
}

  最后完成label触摸事件写好就OK了,当然,lambda表达式用上:

auto *ev = EventListenerTouchOneByOne::create();
//filename = "capturesc.png"; //filename可以在这里初始化 ev->onTouchBegan = [](Touch* t, Event* e){
cocos2d::log("touch begin!");
return true;
}; ev->onTouchMoved = [](Touch* t, Event* e){};
ev->onTouchEnded = [&,caplb](Touch* t, Event* e){
auto pos = t->getLocation();
auto rect = caplb->getBoundingBox();
auto cpos = caplb->convertToNodeSpace(pos);
if (rect.containsPoint (cpos))
{
cocos2d::log("caplb is touched!!");
filename = "scpic.jpg"; //初始化filename,后缀很重要
caplb->setVisible(false);//将Capture这个label隐藏
capturesc(filename); //截屏
}
}; 这段代码写在HelloWord的init函数里面。

  这样就完成了,截屏操作,相对于2.x的截屏好像简单了,这个就仁者见仁智者见智了。在2.x版本里面的截屏操作需要注意的是再创建Render的时候,需要传入渲染颜色深度,否则会导致visit函数渲染时无法正确进行各个对象之间的遮挡关系计算,看下最后的效果图:

那么最后呢,可能截屏并不是我们的最终目的,可能为了游戏的宣传,我们还需要给这张截图添上游戏的宣传边框,这时候,我们就需要在截图之后再次创建一个场景scene,将宣传边框和截图摆好位置,再次截屏,这样就得到一张完整的游戏宣传截图,可以拿来分享到其他社交软件平台上。

  

cocos2dx 3.2 Touch Listen和menu回调实现截屏的更多相关文章

  1. 深入cocos2d-x中的touch事件

    深入cocos2d-x中的touch事件 在文章cocos2d-x中处理touch事件中简单讨论过怎样处理touch事件, 那么今天来深入了解下cocos2d-x中是怎样分发touch事件的. 我们最 ...

  2. 【玩转cocos2d-x之三十九】Cocos2d-x 3.0截屏功能集成

    3.0的截屏和2.x的截屏基本上同样.都是利用RenderTexture来处理,在渲染之前调用call函数,然后调用Cocos的场景visit函数对其进行渲染,渲染结束后调用end函数就可以.仅仅是3 ...

  3. cocos2d-x中处理touch事件

    在cocos2d-x中, touch事件分为两种:一种是单点事件, 另一种是多点事件. 单点事件对应的代理方法是: virtual bool ccTouchBegan(CCTouch *pTouch, ...

  4. Cocos2d-x学习笔记(十)CC_CALLBACK回调函数相关宏

    这里加入一个插曲,是关于Cocos2d-x回调函数的.首先,让我们Cocos支持的回调函数宏有哪些,以及其原型: // new callbacks based on C++11 #define CC_ ...

  5. 解决使用Touch ID API在回调时界面“长时间卡住”的问题

    Touch ID是iOS8上新公开的API,关于详细介绍和用法可以看CocoaChina的这两篇文章:上 和 下,在此篇文章中不再赘述. 我在app中需要的效果是如果touch id验证通过,则页面p ...

  6. cocos2d-x中关于touch事件的响应

    原作者:有缘人  来源:新浪微博 地址:http://blog.sina.com.cn/s/blog_6ac2c7260102vvdu.html 一.touch事件响应分为单点触摸响应和多点触摸响应. ...

  7. cocos2d-x 3.0 touch事件官方解释

    官方解释 http://www.cocos2d-x.org/docs/manual/framework/native/input/event-dispatcher/zh#_1

  8. cocos2dx for lua 截屏功能

    cocos2dx的utils类中包含截图功能,使用方法如下: cc.utils:captureScreen(function(successed,outputFile)--第一个参数是截图成功或者失败 ...

  9. cocos2dx之保存截屏图片

    http://blog.csdn.net/ganpengjin1/article/details/19088921 我们要保存当前的运行的scene的截图的话,我用到CCRenderTexture,看 ...

随机推荐

  1. 搭建Android开发环境。

    1. 从 http://developer.android.com/intl/zh-cn/sdk/index.html 下载ADK 2. 点击SDK.Manager.exe, 遇到闪退的问题,一开始还 ...

  2. python 类、对象、方法、属性

    在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...

  3. Remove openjdk in Ubuntu/Configure jdk and running adb in 64-bit Ubuntu

    sudo apt-get autoremove openjdk-7-jre sudo apt-get purge openjdk* java -version No openjdk available ...

  4. iOS---初识Swift(一)

    一.Swift简介 ○ 2010年的夏天, 苹果公司的开发人员Chris Latten接到了一个特别的任务, 为OS X 和iOS平台开发下一代编程语言, 也就是Swift. ○ 苹果公司于2014年 ...

  5. vs2012 opencv 配置

    一直没有学习C++,以为该语言太过old,所以要学习新的咚咚.一番学习归来,在进行OpenCV的时候,还是要用到这个C++.几次琢磨,终于能够配置好相关的开发环境和问题初步处理,有些内容得赶快记录下来 ...

  6. java语法基本知识

    java中,变量分为局部和成员变量.局部变量在程序运行的过程中在栈stack中分配存储空间. 从上到下是:heap, stack, data segment, code segment.

  7. fontsize可以解决img标签插入图片之间的缝隙

    当我们用img标签连续插入多张图片的时候,图片和图片之间会出现缝隙,通常我们的做法是用DIV将图片包起来进行浮动来解决这个问题,但是还有一种解决方法是在img的父级元素里面设置font-size:0来 ...

  8. UITableView去掉section的header的粘性

    思路:若header的高度为25,在滑动的时候将scrollView的内容偏移量上衣25,其实他还是粘在上面只不过我们看不到他了. ///---用于判断往上滑还是往下滑 var deltaY:CGFl ...

  9. ajax异步提交的两种方法

    第一种是原始的ajax,第二种是在jQuery中使用ajax.这是我为测试两种提交方法而写的一段代码. 1.struts.xml <package name="json" e ...

  10. Cocos2dx对精灵的优化

    cocos2dx针对游戏设计的不同方面会有不同的优化方案,可以对声音,对内存,对图片格式,对色彩等等进行优化.有关这些方面的方法请大家查找其他的文章.我今天要说的是如何对精灵进行优化,程序中我们用到的 ...