cocos creator 放大镜效果

  1. 背景图,没啥好说的,就是简单一张图片
  2. 放大镜,就是可以放一张放大镜图片
  3. 蒙层的作用主要就是为了将里面的图片区域弄成圆形,蒙层节点添加mask,配置遮罩层,让里面的图片可以变成圆形
  4. 需要放大的区域就是我们展示放大的区域了
  5. 照相机就是新建一个camera节点了,同时给放大镜添加上一个新的分组,放大镜选择新的分组,然后照相机这里取消勾选新分组,这样屏幕上就不会展示照相机和其子节点了
  • 完成这一步后,预览界面就只会展示一张背景图了,不会展示放大镜
ini 复制代码
const {ccclass, property} = cc._decorator;

@ccclass
export default class MagnifyingMirror extends cc.Component {
    @property(cc.Node)
    mirror: cc.Node = null;
    @property(cc.Node)
    mirrorCameraNode: cc.Node = null;
    @property(cc.Node)
    tempCameraSpriteNode: cc.Node = null;


    viewSize: cc.Size = null;

    onLoad () {
        this.viewSize = cc.view.getVisibleSize();
        this.initCamera();
        // this.mirrorCameraNode.setPosition(this.mirror.getPosition());
  
        this.node.on(cc.Node.EventType.TOUCH_START, this.touchStartEvent, this);
        this.node.on(cc.Node.EventType.TOUCH_MOVE, this.touchMoveEvent, this);
      }

      touchStartPos: cc.Vec2 = null;
      mirrorOriginPos: cc.Vec2 = null;
      touchStartEvent(event) {
        this.touchStartPos = event.getLocation();
        this.mirrorOriginPos = this.mirror.getPosition();
      }
  
      touchMoveEvent(event) {
        let touchPos: cc.Vec2 = event.getLocation();
        let pos = this.mirrorOriginPos.add(touchPos.subtract(this.touchStartPos))
  
        this.mirror.setPosition(pos);
        this.mirrorCameraNode.setPosition(pos);
      }

      initCamera() {
        let visibleRect = cc.view.getVisibleSize();
        
        let texture = new cc.RenderTexture(); // 创建一个渲染纹理
        texture.initWithSize(visibleRect.width, visibleRect.height); // 设置渲染纹理的大小
        let spriteFrame = new cc.SpriteFrame();
        spriteFrame.setTexture(texture);
        this.mirrorCameraNode.getComponent(cc.Camera).targetTexture = texture; // 设置镜像摄像机的渲染纹理

        this.tempCameraSpriteNode.getComponent(cc.Sprite).spriteFrame = spriteFrame;
        this.tempCameraSpriteNode.scaleY = -4;
        this.tempCameraSpriteNode.scaleX = 4;
      }
}
  • 根结点添加上脚本,对应mirror,mirrorCameraNode,tempCameraSpriteNode,这些选取对应的节点,
kotlin 复制代码
        this.node.on(cc.Node.EventType.TOUCH_START, this.touchStartEvent, this);
        this.node.on(cc.Node.EventType.TOUCH_MOVE, this.touchMoveEvent, this);
  • touchStartEvent方法就是用来移动放大镜
  • touchMoveEvent方法就是移动放大镜里面的内容
ini 复制代码
      initCamera() {
        let visibleRect = cc.view.getVisibleSize();
        
        let texture = new cc.RenderTexture(); // 创建一个渲染纹理
        texture.initWithSize(visibleRect.width, visibleRect.height); // 设置渲染纹理的大小
        let spriteFrame = new cc.SpriteFrame();
        spriteFrame.setTexture(texture);
        this.mirrorCameraNode.getComponent(cc.Camera).targetTexture = texture; // 设置镜像摄像机的渲染纹理

        this.tempCameraSpriteNode.getComponent(cc.Sprite).spriteFrame = spriteFrame;
        this.tempCameraSpriteNode.scaleY = -4;
        this.tempCameraSpriteNode.scaleX = 4;
      }
  • initCamera方法就是配置新的camera节点,添加上texture,并给需要放大的区域,弄上对应的图像
相关推荐
To_OC几秒前
踩了个 TS 的坑之后,我终于把 type 和 interface 掰明白了
前端·react.js·typescript
GreenTea19 分钟前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
浮生望33 分钟前
前端API工程化:用 Mock 数据与 Axios 配置实现独立于后端的并行开发
前端
万少1 小时前
给 DeepSeek Harness 装个"应用商店":一条命令,595 个插件随你逛
前端·javascript·后端
波波0071 小时前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
Brown.alexis2 小时前
es6知识点1-自备使用
前端·ecmascript·es6
小爬的老粉丝3 小时前
JavaScript 纯前端预览 WPS:先识别容器,再路由解析器
前端·javascript·wps
计算机魔术师3 小时前
新兴多智能体系统的模式与问题
前端
用户059540174464 小时前
AI Agent 上下文污染踩坑实录:用 pytest + Redis 揪出 3 类记忆串号 bug,排查 6 小时
前端·css
满栀5854 小时前
状态管理:Redux、Vuex、Pinia 核心区别
前端·javascript·typescript