Cocos Creator 如今还不是很完善,假如截图截得是部分节点,所截图对象会跑到左下角,官方提出的将 renderTexture
添加到场景中去,防止截屏时元素移动,亲测这样虽然截图时对象不会移动可是截得图有问题。javascript
通过测试,RenderTexture
截图的时候会将被截图的对象移到整个场景的左下角,而后根绝设置的 size
,以左下角为坐标原点截取,坐标系的锚点是(0,0)。java
因此,假如被截图对象的锚点为(0.5,0.5),则只能截取右上角的1/4。遂将被截图对象的锚点设置为(0,0)。node
通过测试,我发现被截图对象被隐藏后,只要不在本次刷新界面的时机被激活,好比在下次刷新界面的时候激活,则会恢复到原位(这个激活操做是必须作的,不然被移动的被截图对象也不会恢复到原位!)。git
基于这个测试结果,个人思路是:代替原被截图对象,放置一个虚假精灵,在截图的时候将截取的图显示在这个虚假精灵中,替换原被截图对象,同时隐藏被截图对象。这样就看不到被移动的被截图对象了。而后在一个合适的时机,再激活真实被截图对象,隐藏虚假被截图对象。github
properties: {
// 被截图对象
cocos: cc.Sprite,
// 显示截图的精灵
show: cc.Sprite,
// 被截图对象的虚假替身
cocosImage: cc.Sprite,
},复制代码
须要的注意的是:本例中虚假替身自己是在被截图的对象的位置的,因此后续不须要设置位置。ide
shot: function () {
// 注意,EditBox,VideoPlayer,Webview 等控件没法被包含在截图里面
// 由于这是 OpenGL 的渲染到纹理的功能,上面提到的控件不是由引擎绘制的
if (CC_JSB) {
// 建立 renderTexture
var renderTexture = cc.RenderTexture.create(195, 270);
//实际截屏的代码
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;
// 翻转获得的纹理
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
获得的纹理是上下翻转的,因此须要相应翻转回来!假如不坐旋转就会以下图:this
ii 想要截全屏,只要使用 Canvas
的节点便可,全屏的状况下不须要考虑虚假节点直接截取便可,记得将初始化 RenderTexture
时,传入的 size
为全屏的大小。spa
正常截图完后的图以下:3d
以前也说了,须要在合适时机,激活被截图对象,并隐藏虚假被截图对象,代码以下:
this.cocos.node.active = true;
this.cocosImage.node.active = false复制代码
一、若是待截图的场景中含有 mask
,请使用下面注释的语句来建立 renderTexture
。
var renderTexture = cc.RenderTexture.create(640,960, cc.Texture2D.PIXEL_FORMAT_RGBA8888, gl.DEPTH24_STENCIL8_OES);复制代码
二、把 renderTexture
添加到场景中去,不然截屏的时候,场景中的元素会移动。(确实不移动了,可是截部分节点得图时有问题,假如哪位童鞋测试没问题,但愿能联系我...)
this.node.parent._sgNode.addChild(renderTexture);复制代码
三、把 renderTexture
设置为不可见,能够避免截图成功后,移除 renderTexture
形成的闪烁
renderTexture.setVisible(false);复制代码
四、保存所截的图,而且打印其地址
// 保存截图到本地
renderTexture.saveToFile("demo.png", cc.IMAGE_FORMAT_PNG, true, function () {
});
// 打印本地的地址
cc.log(jsb.fileUtils.getWritablePath());复制代码
本文首发于个人我的博客,但愿你们多多支持!