cocos2dx 3.2 Touch Listen和menu回调实现截屏
在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回调实现截屏的更多相关文章
- 深入cocos2d-x中的touch事件
深入cocos2d-x中的touch事件 在文章cocos2d-x中处理touch事件中简单讨论过怎样处理touch事件, 那么今天来深入了解下cocos2d-x中是怎样分发touch事件的. 我们最 ...
- 【玩转cocos2d-x之三十九】Cocos2d-x 3.0截屏功能集成
3.0的截屏和2.x的截屏基本上同样.都是利用RenderTexture来处理,在渲染之前调用call函数,然后调用Cocos的场景visit函数对其进行渲染,渲染结束后调用end函数就可以.仅仅是3 ...
- cocos2d-x中处理touch事件
在cocos2d-x中, touch事件分为两种:一种是单点事件, 另一种是多点事件. 单点事件对应的代理方法是: virtual bool ccTouchBegan(CCTouch *pTouch, ...
- Cocos2d-x学习笔记(十)CC_CALLBACK回调函数相关宏
这里加入一个插曲,是关于Cocos2d-x回调函数的.首先,让我们Cocos支持的回调函数宏有哪些,以及其原型: // new callbacks based on C++11 #define CC_ ...
- 解决使用Touch ID API在回调时界面“长时间卡住”的问题
Touch ID是iOS8上新公开的API,关于详细介绍和用法可以看CocoaChina的这两篇文章:上 和 下,在此篇文章中不再赘述. 我在app中需要的效果是如果touch id验证通过,则页面p ...
- cocos2d-x中关于touch事件的响应
原作者:有缘人 来源:新浪微博 地址:http://blog.sina.com.cn/s/blog_6ac2c7260102vvdu.html 一.touch事件响应分为单点触摸响应和多点触摸响应. ...
- cocos2d-x 3.0 touch事件官方解释
官方解释 http://www.cocos2d-x.org/docs/manual/framework/native/input/event-dispatcher/zh#_1
- cocos2dx for lua 截屏功能
cocos2dx的utils类中包含截图功能,使用方法如下: cc.utils:captureScreen(function(successed,outputFile)--第一个参数是截图成功或者失败 ...
- cocos2dx之保存截屏图片
http://blog.csdn.net/ganpengjin1/article/details/19088921 我们要保存当前的运行的scene的截图的话,我用到CCRenderTexture,看 ...
随机推荐
- 看的oracle数据库视频 记的一点笔记
3个默认的用户 sys //网络管理员 权限由上到下降低 [最后加上 as sysdba] system //本地管理员 scott //普通用户 默 ...
- c++ 基础一
// my first program in C++ #include <iostream.h> using namespace std; int main() { cout <&l ...
- 转:js中this、call、apply的用法
(一)关于this首先关于this我想说一句话,这句话记住了this的用法你也就差不多都能明白了:this指的是当前函数的对象.这句话可能比较绕,我会举出很多例子和这句话呼应的!(看下文)1.首先看下 ...
- Spring学习笔记(一)
1.1.1Spring是什么? Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发. 1.1.2S ...
- 从angularJS改道Vue.js,趟过第一个坑!
vue采用 new vue()初始化,显然vue内部没有类似jquery ready函数的机制,在文档加载完成后再执行初始化. 今天新学习vue,由于vue采用es5的特殊机制更新UI,我不确定ipa ...
- SQL GROUP BY 中的TOP N
一个示例表test(select * from test): id gid age username1 1 11 zhangsan2 1 13 zhan ...
- DotNetBar中TextBoxDropDown效果图
- linux命令:chgrp
1.命令介绍: chgrp用来改变文件或目录所属组的权限,要改变成的组必须在/etc/group文件存在才可以. 2.命令格式: chgrp [选项] 组 文件 3.命令参数: 必要参数: -c 当发 ...
- softwareTesting_work2_question2
work2类 package com.Phantom; import java.util.Scanner; import javax.print.DocFlavor.INPUT_STREAM; pub ...
- 分享一些DICOM数据下载网站
医院的DICOM数据轻易不让拷出来,所以这里列出一些医学数据,但不局限于DICOM数据网址,供大家下载. 斯坦福大学体数据库(RAW DATA) http://graphics.stanford.ed ...