Cocos Creator 實(shí)現(xiàn)截圖

前言

Cocos Creator 現(xiàn)在還不是很完善,假如截圖截得是部分節(jié)點(diǎn),所截圖對象會(huì)跑到左下角,官方提出的將 renderTexture 添加到場景中去,防止截屏?xí)r元素移動(dòng),親測這樣雖然截圖時(shí)對象不會(huì)移動(dòng)但是截得圖有問題。

一、具體步驟

1、更改被截圖對象的錨點(diǎn)

經(jīng)過測試,RenderTexture 截圖的時(shí)候會(huì)將被截圖的對象移到整個(gè)場景的左下角,然后根絕設(shè)置的 size ,以左下角為坐標(biāo)原點(diǎn)截取,坐標(biāo)系的錨點(diǎn)是(0,0)。

所以,假如被截圖對象的錨點(diǎn)為(0.5,0.5),則只能截取右上角的1/4。遂將被截圖對象的錨點(diǎn)設(shè)置為(0,0)。

2、添加一個(gè)虛假被截圖對象

經(jīng)過測試,我發(fā)現(xiàn)被截圖對象被隱藏后,只要不在本次刷新界面的時(shí)機(jī)被激活,比如在下次刷新界面的時(shí)候激活,則會(huì)恢復(fù)到原位(這個(gè)激活操作是必須做的,否則被移動(dòng)的被截圖對象也不會(huì)恢復(fù)到原位?。?。

基于這個(gè)測試結(jié)果,我的思路是:代替原被截圖對象,放置一個(gè)虛假精靈,在截圖的時(shí)候?qū)⒔厝〉膱D顯示在這個(gè)虛假精靈中,替換原被截圖對象,同時(shí)隱藏被截圖對象。這樣就看不到被移動(dòng)的被截圖對象了。然后在一個(gè)合適的時(shí)機(jī),再激活真實(shí)被截圖對象,隱藏虛假被截圖對象。

3、正式截圖

① 設(shè)置三個(gè)對象如下代碼:

    properties: {

        // 被截圖對象 
        cocos: cc.Sprite,
        // 顯示截圖的精靈
        show: cc.Sprite,
        // 被截圖對象的虛假替身
        cocosImage: cc.Sprite,
    },
    

需要的注意的是:本例中虛假替身本身是在被截圖的對象的位置的,所以后續(xù)不需要設(shè)置位置。

② 截圖核心代碼:

shot: function () {

        // 注意,EditBox,VideoPlayer,Webview 等控件無法被包含在截圖里面
        // 因?yàn)檫@是 OpenGL 的渲染到紋理的功能,上面提到的控件不是由引擎繪制的
        
        if (CC_JSB) {

            // 創(chuàng)建 renderTexture
            var renderTexture = cc.RenderTexture.create(195, 270);
            
            //實(shí)際截屏的代碼
            renderTexture.begin();
            this.cocos._sgNode.visit();
            renderTexture.end();

            // 獲取SpriteFrame
            var nowFrame = renderTexture.getSprite().getSpriteFrame();

            // 賦值給需要截圖的精靈
            this.show.spriteFrame = nowFrame;

            // 顯示虛假的代替精靈
            this.cocosImage.node.active = true;
            this.cocosImage.spriteFrame = nowFrame;

            // 翻轉(zhuǎn)得到的紋理
            var action = cc.flipY(true);
            this.show.node.runAction(action);
            
            var action1 = cc.flipY(true);
            this.cocosImage.node.runAction(action1);

            // 隱藏被截圖的對象
            this.cocos.node.active = false;
        }
    },

需要注意的:

i RenderTexture 得到的紋理是上下翻轉(zhuǎn)的,所以需要相應(yīng)翻轉(zhuǎn)回來!假如不坐旋轉(zhuǎn)就會(huì)如下圖:

ii 想要截全屏,只要使用 Canvas 的節(jié)點(diǎn)即可,全屏的情況下不需要考慮虛假節(jié)點(diǎn)直接截取即可,記得將初始化 RenderTexture 時(shí),傳入的 size 為全屏的大小。

正常截圖完后的圖如下:

4、顯示原圖

之前也說了,需要在合適時(shí)機(jī),激活被截圖對象,并隱藏虛假被截圖對象,代碼如下:

this.cocos.node.active = true;
this.cocosImage.node.active = false

二、其他事項(xiàng)

1、如果待截圖的場景中含有 mask,請使用下面注釋的語句來創(chuàng)建 renderTexture。

var renderTexture = cc.RenderTexture.create(640,960, cc.Texture2D.PIXEL_FORMAT_RGBA8888, gl.DEPTH24_STENCIL8_OES);

2、把 renderTexture 添加到場景中去,否則截屏的時(shí)候,場景中的元素會(huì)移動(dòng)。(確實(shí)不移動(dòng)了,但是截部分節(jié)點(diǎn)得圖時(shí)有問題,假如哪位童鞋測試沒問題,希望能聯(lián)系我...)

this.node.parent._sgNode.addChild(renderTexture);

3、把 renderTexture 設(shè)置為不可見,可以避免截圖成功后,移除 renderTexture 造成的閃爍

renderTexture.setVisible(false);

4、保存所截的圖,并且打印其地址

// 保存截圖到本地
renderTexture.saveToFile("demo.png", cc.IMAGE_FORMAT_PNG, true, function () {
               
            });

// 打印本地的地址   
cc.log(jsb.fileUtils.getWritablePath());

三、Demo

點(diǎn)擊進(jìn)入Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,794評論 25 709
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 12,308評論 6 13
  • 17款豐田霸道3000后掛備胎比16款霸道3000配置有所增加,外觀沒有太大的改動(dòng),只是輪胎由245變成265的輪...
    高遠(yuǎn)說車閱讀 347評論 0 4
  • 路上的紅葉落下很好看 車經(jīng)過帶著風(fēng) 葉子會(huì)起舞 還會(huì)發(fā)出莎莎的聲響 一排六七個(gè)穿著黃色衣服的美團(tuán)外賣小哥騎著小電驢...
    07267ecb7d33閱讀 355評論 0 0
  • 看看你,看看我??纯醋蛱?,看看今天。想想當(dāng)初,想想未來。不過是每個(gè)人都有各自的生活方式,不同的選擇,不同的興趣。從...
    Miss_舒閱讀 1,055評論 0 0

友情鏈接更多精彩內(nèi)容