Cocos Creator截图

本文详细介绍了CocosCreator2.0中截图功能的变化,包括从旧版本渲染树到资源类型的过渡,以及在新版本中如何使用cc.RenderTexture完成截图操作。同时提供了针对不同场景的解决方案,如截取整个Canvas、单个node以及包含mask的节点,确保开发者能够顺利迁移并应用新功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 1.x 中,我们一般通过 cc.RenderTexture 来完成截图功能,但是这是属于旧版本渲染树中的一个功能,在Cocos Creator2.0去除渲染树后,截图功能的使用方式也完全不同了。简单来说,2.0 中 cc.RenderTexture 变成了一个资源类型,继承自贴图(cc.Texture)资源。我们通过将某个摄像机内容渲染到 cc.RenderTexture 资源上完成截图,具体的使用方式参考Cocos Creator文档中 Camera 文档截图章节。

摄像机可能是 1.x 到 2.0 改动最大的一个组件,为了可以顺畅更新,Creator 尽量保持了组件层 API 的一致性,然而 Camera 的使用方式和 API 却无法做到简单迁移。因为在 2.0 中,Camera 从一个配角变成了主角。

Cocos Creator2.0截图

官方文档里给出了浏览器的截图方法,但是没有提供保存图片的方法,所以原生平台目前大概还不能用

let node = new cc.Node();
node.parent = cc.director.getScene();
let camera = node.addComponent(cc.Camera);

// 设置你想要的截图内容的 cullingMask
camera.cullingMask = 0xffffffff;

// 新建一个 RenderTexture,并且设置 camera 的 targetTexture 为新建的 RenderTexture,这样 camera 的内容将会渲染到新建的 RenderTexture 中。
let texture = new cc.RenderTexture();
texture.initWithSize(cc.visibleRect.width, cc.visibleRect.height);
camera.targetTexture = texture;

// 渲染一次摄像机,即更新一次内容到 RenderTexture 中
camera.render();

// 这样我们就能从 RenderTexture 中获取到数据了
let data = texture.readPixels();

// 接下来就可以对这些数据进行操作了
let canvas = document.createElement('canvas');
let ctx = canvas.getContext('2d');
canvas.width = texture.width;
canvas.height = texture.height;

let rowBytes = width * 4;
for (let row = 0; row < height; row++) {
    let srow = height - 1 - row;
    let imageData = ctx.createImageData(width, 1);
    let start = srow*width*4;
    for (let i = 0; i < rowBytes; i++) {
        imageData.data[i] = data[start+i];
    }

    ctx.putImageData(imageData, 0, row);
}

let dataURL = canvas.toDataURL("image/jpeg");
let img = document.createElement("img");
img.src = dataURL;

Cocos Creator1.x 截图

遇到的问题

首先如果截取的是整个Canvas的话,官方文档也没有详细的说明,直接使用 cc.RenderTexture 就可以截图

但是如果截取的是单个node,则显示会有问题

Q&A:

1.如果只截取到部分图片?
需要将截取的节点的父节点的锚点设置为(0,0)
2.截取图片后,整个node会移动到左下?
可以先将该node隐藏,然后再显示出截取的图片替代该node
3.如何截取有mask的节点?
创建cc.RenderTexture时,需要增加两个参数: cc.RenderTexture.create(640,960, cc.Texture2D.PIXEL_FORMAT_RGBA8888, gl.DEPTH24_STENCIL8_OES);

截图核心代码:

let cocos = cc.find('cocos2', this.node);
    // 创建 renderTexture
let renderTexture = cc.RenderTexture.create(
    cocos.width,
    cocos.height,
    cc.Texture2D.PIXEL_FORMAT_RGBA8888,
    gl.DEPTH24_STENCIL8_OES
);

renderTexture.begin();
cocos._sgNode.visit();
renderTexture.end();
// 保存截图文件
renderTexture.saveToFile("shot.png", cc.IMAGE_FORMAT_PNG, true, function () { });

// 获取图片保存地址
jsb.fileUtils.getWritablePath()

Demo

https://github.com/wf96390/CocosScreenShotDemo

### 实现 Cocos Creator 中的截屏功能 在 Cocos Creator 中实现截屏功能主要依赖于 `RenderTexture` 和摄像机组件。通过设置摄像机的目标纹理为目标 `RenderTexture` 对象,可以捕获场景中的特定部分并将其保存为图像。 #### 使用 RenderTexture 进行屏幕捕捉 为了创建一个基本的截屏机制,首先需要实例化一个新的 `RenderTexture` 并指定其尺寸: ```javascript let renderTexture = new cc.RenderTexture(); renderTexture.initWithSize(800, 600); ``` 接着配置摄像机以使用这个自定义的 `RenderTexture` 来代替默认视窗作为输出目标: ```javascript camera.targetTexture = renderTexture; ``` 当准备好要拍摄的画面时,调用 `newImage()` 方法来获取当前帧的数据,并转换成可用于分享或其他用途的形式: ```javascript // 创建临时画布用于绘制 RenderTexture 内容 const tempCanvas = document.createElement('canvas'); tempCanvas.width = renderTexture.width; tempCanvas.height = renderTexture.height; // 获取上下文并将 RenderTexture 数据复制到新画布上 const ctx = tempCanvas.getContext('2d'); ctx.drawImage(renderTexture.readPixels(), 0, 0); // 将 canvas 转换为图片文件对象 const imgDataUrl = tempCanvas.toDataURL('image/png'); // 渲染完成之后记得重置相机 targetTexture 属性以便恢复正常显示 camera.targetTexture = null; ``` 以上代码片段展示了如何利用 JavaScript API 完整地执行一次截图操作[^1]。 对于不同版本之间的差异,在 Cocos Creator 2.x 和 3.x 版本之间虽然实现了相似的功能逻辑,但是具体的类名和方法签名可能会有所不同。因此建议查阅对应版本的手册文档了解最新的API变化情况[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值