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/2, size.height/2));
        scene->addChild(sp);

        auto lb = LabelTTF::create();
        lb->setString("capture success!");
        lb->setColor(ccc3 (255, 0, 0));
        lb->setFontSize(40);
        lb->setAnchorPoint(Vec2(0.5f, 1.0f));
        lb->setPosition(Vec2(size.width/2, 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(255, 0, 0, 255));
        lb->setPosition(Vec2(size.width / 2, size.height/2));
        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函数渲染时无法正确进行各个对象之间的遮挡关系计算,看下最后的效果图:

  

时间: 2024-08-29 01:41:46

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

Cocos2d-x 3.2 Lua示例 CaptureScreen(截屏)

Cocos2d-x 3.2 Lua示例 CaptureScreen(截屏) 转载请注明:IT_xiao小巫 Cocos2d-x截屏功能是从3.2开始提供的,本篇博客就是介绍Cocos2d-x 3.2中Lua示例中的截屏功能.效果如下所示: 例子代码如下: --[[ 截屏测试 CaptureScreenTest ]]-- -- 获取屏幕大小 local winSize = cc.Director:getInstance():getWinSize() local kTagSprite = 1 loc

【COCOS2D-X 备注篇】cocos2dx 获取手机截屏等意外取消触屏事件的处理方法!

最近有童鞋问我如何获取到iphone手机截屏的事件,所以本篇就简单的聊下这种问题的处理办法. 在cocos2dx引擎中,我们能在AppDelegate中获取到,用户将应用切入后台,以及重新返回应用的事件函数.那么对应的,cocos2dx也在引擎中给予我们截取屏幕等这种只能手机应有事件的处理函数. 其实大家应该都很熟悉截取用户触屏的函数,如下: 1 2 3 4 // default implements are used to call script callback if exist virtu

Cocos2d-x 截屏功能集成

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 != fileNam

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

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

用C++在cocos2d-x 3.2下完美解决Menu吞掉事件导致ScrollView等无法响应的问题

本文原创,如转载请注明原文地址. http://blog.csdn.net/q229827701/article/details/38901213 最近下了最新版本的cocos2dx 3.2做项目,发现一个坑爹的问题.ScrollView 的子控件上有Menu的时候,ScrollView滑动无法响应. 百度了很多资料,要么说不清楚,要么版本很旧的不适合. 于是自己跑去看了下源码. 发现Menu里面有一句 touchListener->setSwallowTouches(true); 将true修

cocos2d-x 3.0 touch事件官方解释

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

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

原作者:有缘人  来源:新浪微博 地址:http://blog.sina.com.cn/s/blog_6ac2c7260102vvdu.html 一.touch事件响应分为单点触摸响应和多点触摸响应. 单点触摸响应需要重载的方法: virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); virtual void

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

Touch ID是iOS8上新公开的API,关于详细介绍和用法可以看CocoaChina的这两篇文章:上 和 下,在此篇文章中不在赘述. 我在app中需要的效果是如果touch id验证通过,则页面push到下一个viewController,否则本视图的数字密码输入框becomeFirstResponder.研究过touch id的人应该知道,这段代码大概会这么实现: 1 LAContext *context = [[LAContext alloc] init]; 2 NSError *err

cocos2dx for lua 截屏功能

cocos2dx的utils类中包含截图功能,使用方法如下: cc.utils:captureScreen(function(successed,outputFile)--第一个参数是截图成功或者失败的回调函数 if successed then--如果成功,返回true,否则返回nil local sp = cc.Sprite:create(outputFile) end end,"captureTexture.png")第二个参数是保存文件名 看cocos源代码,截图文件会将保存在