Cocos Creator 2D摄像机 [Lv.2] 截图

2023-11-08 23:20

本文主要是介绍Cocos Creator 2D摄像机 [Lv.2] 截图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 摘要
    • 环境
    • 资源
    • 准备工作
    • 正式开始
      • 对工程做一些修改
      • 如何互动
      • 通过`RenderTexture` + `SpriteFrame`来实现小视图
      • 截图
    • 划重点

摘要

本文在Cocos Creator 2D摄像机 [Lv.1] 小视图所完成的工程的基础上进行修改,并增加截图功能。

环境

  • Cocos Creator 2.4.4

资源

  • 官方Demo(capture_to_native)
  • 本文Demo(CaptureScreenDemo)

准备工作

  1. Cocos Creator 2D摄像机 [Lv.1] 小视图 所完成的工程。

正式开始

对工程做一些修改

资源管理器
拷贝MiniMapDemo场景,重命名为CaptureScreenDemo
拷贝MiniMapController.js脚本,重命名为CaptureScreenController.js
在这里插入图片描述
层级管理器
在这里插入图片描述

  1. CaptureScreenController.js脚本,挂载在CaptureScreenController节点上。

之后节点相关的设置请参考工程中的设置,文中不再赘述。

如何互动

截图功能需要通过RenderTexture实现。
将摄像机照到的图像,渲染到RenderTexture上,然后从RenderTexture上读取出图像数据。
我们将通过右键点击,来触发截图功能。

通过RenderTexture + SpriteFrame来实现小视图

创建一个sprite,用来显示小视图,默认的SpriteFrame删除掉。
在这里插入图片描述 在这里插入图片描述
CaptureScreenController.js中实现功能。

...
let _texture = null		// RenderTexturecc.Class({...properties: {...smallView: cc.Sprite, 	// 小视图。},onLoad () {..._texture = new cc.RenderTexture()_texture.initWithSize(_canvasWidth, _canvasHeight, cc.gfx.RB_FMT_S8)this.camera.targetTexture = _texture	// 将摄像机的渲染重定向到 RenderTexture 上。// spriteFrame 的 texture 指定为 RenderTexture ,// 再把 spriteFrame 添加到 smallView 上,// 这样摄像机照到的图像就能通过 smallView 显示出来了。let spriteFrame = new cc.SpriteFrame()spriteFrame.setTexture(_texture)this.smallView.spriteFrame = spriteFrame}, ...
});

将节点挂载到脚本对应变量上。
在这里插入图片描述
运行起来,看看效果,
在这里插入图片描述
小视图怎么这么小,而且还倒过来了。
小视图很小是由于camera.rect发挥的作用。原先是以整个屏幕作为根本,设置的rect。现在将targetTexture定向到了smallView上,由于smallView已经设置了需要的大小,所以重置camera.rect,让其按照默认的位置和尺寸显示就可以了。
在这里插入图片描述 在这里插入图片描述
显示倒过来的问题,我们可以通过设置smallViewscaleY = -1来解决。
同时还有一点,我们要将smallView的分组设置为brush。反正不能放在default分组里,否则小视图又会被摄像机渲染出来。
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
运行起来,看看效果,
在这里插入图片描述
已经能正常显示了。但是又发现个小问题,小视图边框(黄线)的显示不太正常。
这是由于原先通过camera.rect实现时,小视图边框是通过camera.rect计算出来的。现在通过smallView来显示,我们就需要通过其Node的属性来计算小视图的边框。
CaptureScreenController.js中修改calCameraDisplayRect函数的实现。

calCameraDisplayRect: function () {let cameraPos = this.smallView.node.getPosition()	// 根据 smallView 的位置来计算。let cameraAnchor = cc.Vec2(this.smallView.node.anchorX, this.smallView.node.anchorX)let cameraSize = {width: this.smallView.node.width, height: this.smallView.node.height}// 绘制的矩形以左下角为原点。return new cc.Rect(cameraPos.x - cameraAnchor.x * cameraSize.width, cameraPos.y - cameraAnchor.y * cameraSize.height, cameraSize.width, cameraSize.height)}, 

运行起来,看看效果,
在这里插入图片描述
一切都正常了。

截图

CaptureScreenController.js中实现功能。

...
cc.Class({...onLoad () {...// 鼠标释放事件,通过右键点击鼠标截图。this.node.on(cc.Node.EventType.MOUSE_UP, this.onMouseUp, this)...}, ...onMouseUp (event) {let mouseType = event.getButton()if (mouseType === cc.Event.EventMouse.BUTTON_RIGHT) {	// 鼠标右键释放。this.captureScreen()	// 截图。}}, ...captureScreen () {this.camera.render()	// 手动渲染摄像机。let picData = _texture.readPixels()		// 从 RenderTexture 中读取图像数据。// 图像默认 Y 轴是颠倒的,需要翻转一下 Y 轴。picData = this.filpYImage(picData, _texture.width, _texture.height)this.saveFile(picData)	// 存储图像。}, saveFile (picData) {if (CC_JSB) {// 存储到可写路径下。let filePath = jsb.fileUtils.getWritablePath() + 'render_to_sprite_image.png'// 存储图像。let success = jsb.saveImageData(picData, _texture.width, _texture.height, filePath)if (success) {cc.log("save image data success, file: " + filePath)}else {cc.error("save image data failed!")}}}, // This is a temporary solutionfilpYImage (data, width, height) {// create the data arraylet picData = new Uint8Array(width * height * 4)	// 每个像素 4 字节。let rowBytes = width * 4for (let row = 0; row < height; row++) {let srow = height - 1 - rowlet start = srow * width * 4	// 从最后一行开始递减。let reStart = row * width * 4	// 从第一行开始递增。// save the piexls datafor (let i = 0; i < rowBytes; i++) {picData[reStart + i] = data[start + i]}}return picData}, 
})

运行起来,看看效果,
在这里插入图片描述
成功生成了截图文件。

划重点

  • 通过RenderTexture + SpriteFrame来实现小视图。
  • Camera.render() -> RenderTexture.readPixels() -> filpYImage() -> jsb.fileUtils.getWritablePath() -> jsb.saveImageData()

这篇关于Cocos Creator 2D摄像机 [Lv.2] 截图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/373052

相关文章

如何利用Python实现给Excel表格截图

《如何利用Python实现给Excel表格截图》这篇文章主要为大家详细介绍了如何利用Python实现给Excel表格截图功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 我搜索了网络上的方案,感觉把 Excel 表格转换为 html 再用 platwright 截图是比China编程较顺

超强的截图工具:PixPin

你是否还在为寻找一款功能强大、操作简便的截图工具而烦恼?市面上那么多工具,常常让人无从选择。今天,想给大家安利一款神器——PixPin,一款真正解放双手的截图工具。 想象一下,你只需要按下快捷键就能轻松完成多种截图任务,还能快速编辑、标注甚至保存多种格式的图片。这款工具能满足这些需求吗? PixPin不仅支持全屏、窗口、区域截图等基础功能,它还可以进行延时截图,让你捕捉到每个关键画面。不仅如此

java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频)

这是什么系统? 资源获取方式在最下方 java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频) 停车管理信息系统是为了提升停车场的运营效率和管理水平而设计的综合性平台。系统涵盖用户信息管理、车位管理、收费管理、违规车辆处理等多个功能模块,旨在实现对停车场资源的高效配置和实时监控。此外,系统还提供了资讯管理和统计查询功能,帮助管理者及时发布信息并进行数据分析,为停车场的科学

Debugging Lua Project created in Cocos Code IDE creates “Waiting for debugger to connect” in Win-7

转自 I Installed Cocos Code IDE and created a new Lua Project. When Debugging the Project(F11) the game window pops up and gives me the message waiting for debugger to connect and then freezes. Also a

Matter.js:Web开发者的2D物理引擎

Matter.js:Web开发者的2D物理引擎 前言 在现代网页开发中,交互性和动态效果是提升用户体验的关键因素。 Matter.js,一个专为网页设计的2D物理引擎,为开发者提供了一种简单而强大的方式,来实现复杂的物理交互效果。 无论是模拟重力、碰撞还是复杂的物体运动,Matter.js 都能轻松应对。 本文将带你深入了解 Matter.js ,并提供实际的代码示例,让你一窥其强大功能

在 Qt Creator 中,输入 /** 并按下Enter可以自动生成 Doxygen 风格的注释

在 Qt Creator 中,当你输入 /** 时,确实会自动补全标准的 Doxygen 风格注释。这是因为 Qt Creator 支持 Doxygen 以及类似的文档注释风格,并且提供了代码自动补全功能。 以下是如何在 Qt Creator 中使用和显示这些注释标记的步骤: 1. 自动补全 Doxygen 风格注释 在 Qt Creator 中,你可以这样操作: 在你的代码中,将光标放在

QtC++截图支持窗口获取

介绍 在截图工具中你会发现,接触到窗口后会自动圈出目标窗口,个别强大一点的还能进行元素识别可以自动圈出元素,那么今天简单分析一下QTc++如何获取窗口并圈出当前鼠标下的窗口。 介绍1.如何获取所有窗口2.比较函数3.实现窗口判断 结尾 1.如何获取所有窗口 1.我们需要调用windows接口EnumWindowsProc回调函数来获取所有顶级窗口,需要包含windows.

行为智能识别摄像机

行为智能识别摄像机 是一种结合了人工智能技术和监控摄像技术的先进设备,它能够通过深度学习算法对监控画面进行实时分析,自动识别和分析监控画面中的各种行为动作。这种摄像机在安防领域有着广泛的应用,可以帮助监控人员及时发现异常行为,并采取相应的措施。 行为智能识别摄像机可以有效预防盗窃事件。在商场、超市等公共场所安装这种摄像机,可以通过识别异常行为等情况,及时报警并阻止不安全行为的发生

Unity3D在2D游戏中获取触屏物体的方法

我们的需求是: 假如屏幕中一个棋盘,每个棋子是button构成的,我们希望手指或者鼠标在哪里,就显示那个位置的button信息。 网上有很多获取触屏物体信息的信息的方法如下面代码所示: Camera cam = Camera.main; // pre-defined...if (touch.phase == TouchPhase.Bagan)){ // 如果触控点状态为按下Ray

GB35114 USC安防平台 中星微国密摄像机配置 流程

中星微国密摄像机配置介绍   如下以中星微VS-IPC8021S-Y-T4摄像机为例,需要先各自获取p10文件,并通过证书签发机构或者测试SM2证书签发获取证书。 网络配置如下:  摄像机的IP地址为192.168.1.108,国标ID为34020000001320000015  系统的IP地址为192.168.1.109,国标ID为34020000002000000101 摄像机软件版本如下: