Egret的2D摄像机实现

2023-11-16

一个Egret的正交摄像机的简单实现,主要功能大致如下:
可参考根据实际进行调整

module Camera {
	/**一个正交摄像机demo*/
	export class Camera {
		/**摄像机显示的对象,实际是镜头所对应的世界*/
		m_container: eui.UILayer;
		/**摄像机宽 */
		m_width: number;
		/**摄像机高 */
		m_height: number;
		/**摄像机的焦点X */
		m_zoomX: number;
		/**摄像机的焦点Y */
		m_zoomY: number;
		/**摄像机焦距*/
		m_zoom: number;
		/**跟随对象 */
		m_follower: eui.Component;
		/**摄像机X轴偏移值 */
		m_cameraOffsetX: number;
		/**摄像机Y轴偏移值 */
		m_cameraOffsetY: number;

		public constructor(width: number, height: number) {
			this.m_width = width;
			this.m_height = height;
			this.m_cameraOffsetX = 0;
			this.m_cameraOffsetY = 0;
		}
		/**初始化相机,绑定镜头 */
		public init(container: eui.UILayer) {
			this.m_container = container;
			this.m_zoomX = this.m_container.x;
			this.m_zoomY = this.m_container.y;
		}
		/**设置镜头锚点 
		 * @param LRRate 左右比例 
		 * @param UDRate 上下比例
		 * 根据左右及上下的比例确定镜头的聚焦点
		*/
		public setAnchor(LRRate: number, UDRate: number) {
			if (this.m_container != null) {
				this.m_container.anchorOffsetX = this.m_container.width * LRRate;
				this.m_container.anchorOffsetY = this.m_container.height * UDRate;
				this.m_container.x = this.m_container.anchorOffsetX;
				this.m_container.y = this.m_container.anchorOffsetY;
				this.m_zoomX = this.m_container.anchorOffsetX;
				this.m_zoomY = this.m_container.anchorOffsetY;
			}
		}

		/**设置镜头焦距
		 * @param zoom 焦距,镜头距离世界的比例,默认为1,焦距越小,视觉越大
		*/
		public setZoom(zoom: number) {
			if (this.m_container != null) {
				this.m_container.scaleX = this.m_container.width / this.m_width / zoom;
				this.m_container.scaleY = this.m_container.height / this.m_height / zoom;
			}
		}
		/**旋转
		 * @param rotation 旋转角度
		 * 
		 */
		public setRotation(rotation: number) {
			if (this.m_container != null) {
				this.m_container.rotation = rotation;
			}
		}
		/**设置跟随者 */
		public follow(follower: eui.Component) {
			if (this.m_container != null) {
				this.m_follower = follower;
				this.m_zoomX = this.m_follower.x;
				this.m_zoomY = this.m_follower.y;
				this.setAnchor(this.m_follower.x / this.m_container.width, this.m_follower.y / this.m_container.height);
			}
		}
		/**摄像机X轴移动 
		 * @param x 沿x轴移动的有向速度
		 * 
		*/
		public CameraMoveX(x: number) {
			console.log(x);
			this.m_cameraOffsetX = x;
			this.CameraUpdate();
			this.m_cameraOffsetX = 0;
		}
		/**摄像机Y轴移动 
		 * @param y 沿y轴移动的有向速度
	 	 * 
		 */
		public CameraMoveY(y: number) {
			this.m_cameraOffsetY = y;
			this.CameraUpdate();
			this.m_cameraOffsetY = 0;
		}

		/**通过摄像头偏移值计算世界内物品的偏移值
		 * 如果设置了跟随者,则跟随者在世界内的距离不变,其他物体根据镜头偏移量进行坐标修正
		 * 如果没有设置跟随者,则视世界全局可见,全员根据镜头偏移量进行坐标修正
		 * 注意1:摄像机移动的实现方式实际是世界内物品相对于世界进行的坐标的移动,但世界本身是固定的,变化的只是世界内部的物体
		 * 注意2:实际上,这里的坐标修正应该交给各个世界对象去自行实现,以便各物体对象能以此修正自身的行为,这里为了形成一个
		 * 统一的认识而把偏移的工作放进摄像机,就造成摄像机的功能比较单一的问题
		*/
		public CameraUpdate() {
			for (let i = 0; i < this.m_container.numChildren; i++) {
				if (this.m_follower != null) {
					if (this.m_follower != this.m_container.getChildAt(i)) {
						this.m_container.getChildAt(i).x -= this.m_cameraOffsetX;
						this.m_container.getChildAt(i).y -= this.m_cameraOffsetY;
					}
				} else {
					this.m_container.getChildAt(i).x -= this.m_cameraOffsetX;
					this.m_container.getChildAt(i).y -= this.m_cameraOffsetY;
				}
			}
		}
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Egret的2D摄像机实现 的相关文章

  • Unity基础知识及一些基本API的使用

    Unity基础知识及一些基本API的使用 1 Unity界面介绍 Unity的默认Editor窗口主要呈现为以上布局 它们分别为 1 工具栏 工具栏提供最基本的工作功能 左侧的按钮用于访问 Unity Collaborate Unity 云
  • 【Unity】2D太空登录小游戏开发入门教程(下)

    Unity 是一款非常流行且用途广泛的游戏引擎 拥有一长串受支持的平台和设备 3D 游戏可能是您谈到 Unity 时的第一个想法 该引擎甚至曾经被称为Unity 3D 但是 大部分移动 主机和桌面游戏都是以 2D 形式呈现的 因此了解 Un
  • Unity 将图片做成预制体

    Unity 将图片做成预制体 刚导入Assets的图片是无法直接拖入场景中的 若我们想要将图片变成预制体 需要做一点转化 方法如下 选中想要转成预制体的图片 更改如下图 然后就可以将图片拖入场景中 进而拖进Assets里面制成预制体啦
  • unity期末大作业 搬运东西过河 益智游戏

    unity期末大作业 搬运东西过河 益智游戏 详细情况如下动态图 点我下载 https download csdn net download weixin 43474701 75859840
  • Unity处决动画实现思路

    前言 不只是处决动画 只要是需要多个动画目标配合的都可以参考下面的思路 方案一 去除掉动画的位移部分 xz 在合适的时机移动到固定的位置双方同时播放动画 比如实现下图中狼和鹿的捕猎动画 我的做法是在要开始播放处决动画之前先让狼位移到固定位置
  • ue4 蓝图通信的几种方式

    一 设置公有变量 完成通信 1 蓝图类Door bp中声明变量NewVar 1 为公有 确定好变量类型 编译 2 关卡视口中选中这个蓝图类Door bp的实例 世界大纲视图下的细节面板中 默认下出现公有变量名称NewVar 1 用吸管吸取关
  • unity和ffmpeg修改局部视频速度

    unity版本2020 3 17 前言 最近有个功能是 在一个展馆里面 有一个摄像头旋转拍照 拍一圈 本来功能很简单 就录屏就可以了上传生成二维码就ok了 但是 需要一个视频中间快两边变慢的效果 查了很多资料 最终决定使用ffmpeg和un
  • Unity中Shader实现UI去色功能的实现思路

    文章目录 前言 一 在开发过程中 在UI中会涉及一些需要置灰UI的需求 有很多实现的方法 1 做两套纹理 通过程序控制切换 2 使用shader实现对纹理去色 二 这里主要记录用shader实现的思路 1 基础纹理的采样 2 支持组件中的调
  • PicoNeo3开发VR——小白教程

    不断更新中 欢迎大佬们来指导 纠错 导入PicoVRSDK 1 新创一个Unity工程 Unity版本最好选择2019 4以上版本 以及需配置好安卓环境 然后导入官方picoVRSDK 2 渲染设置 Graphics APIs暂不支持Vul
  • UE4 射线检测案例(C++)

    UE4 射线检测 C 开发场景 玩家 C 开发的 武器 C 射线检测函数 蓝图 C 效果 制作流程 添加开火按键映射 新建一个继承ACharacter的C 用蓝图继承刚刚新建的C 然后设置好游戏模式 我 这是是 用了一个枚举 其实你直接调用
  • Unity 使用LineRenderer连接2个物体

    1 在Hierarchy面板中创建2个GameObject A和B 这就是希望连接的2个物体 2 同理创建1个EmptyObject C 挂上LineRenderer组件 记得给Materials赋值 3 创建1个新的C 脚本LineMan
  • Unity 用脚本操作常用UI控件(上)

    控件介绍 在界面系统的术语中 将一个具有独立状态 外观和操作的对象称为控件 例如 常用的交互控件有按钮 输入框 滑动条等 常见的非交互式控件有文本标签 图片等 Unity采用了父子物体和组件的设计思想 其每个界面控件 往往也是由游戏物体挂载
  • HTML5游戏实战(2):90行代码实现捕鱼达人

    捕鱼达人是一款非常流行的游戏 几年里赚取了数以千万的收入 这里借用它来介绍一下用Gamebuilder CanTK开发游戏的方法 其实赚钱的游戏未必技术就很难 今天我们就仅用90来行代码来实现这个游戏 CanTK Canvas ToolKi
  • Unity WebGL错误集锦

    ips 0 Unity的PlayerSettings的otherSettings或者Publish Settings里面的Enable Exceptions里面选择Full StackTrace 可以在打出的包中的浏览器的webgl打印出错
  • Egret游戏通用开发框架

    地址 https github com yicaoyimuys EgretGameEngine 简介 现在这套代码已经有几个项目都在使用了 主要用于各项目组间统一开发规范 便于开发人员调整 以及新手快速熟悉项目 支持Egret2 0 x和2
  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • unity3d大型互动照片墙

    1 本次应客户需求 制作一个大型照片墙互动 输出分辨率为9600 4320 注 unity3d官方推荐最大分辨率为8192 3686 4 经过现场长达24小时暴力测试中途未发生问题 姑且判定可以达到正常标准 废话不多说 先上效果 unity
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • unity小球跟随音乐节奏放大缩小和改变颜色

    放在小球身上 设置对应组件即可 using System Collections using System Collections Generic using Unity VisualScripting using UnityEngine
  • VS2022 | 显示Unreal Engine日志

    VS2022 显示Unreal Engine日志 视图 gt 其他窗口 gt Unreal Engine日志 视图 gt 其他窗口 gt Unreal Engine日志

随机推荐

  • pushd命令

    1 功能pushd命令常用于将目录加入到栈中 加入记录到目录栈顶部 并切换到该目录 若pushd命令不加任何参数 则会将位于记录栈最上面的2个目录对换位置2 语法 1 格式 pushd 目录 N N n 2 选项目录 将该目录加入到栈顶 并
  • 边界框回归的魔法:揭秘精准高效的MPDIoU损失函数

    文章目录 摘要 1 简介 2 相关工作 2 1 目标检测和实例分割 2 2 场景文本识别 2 3 边界框回归的损失函数 3 点距最小的并集交点 4 实验结果 4 1 实验设置 4 2 数据集 4 3 评估协议 4 4 目标检测的实验结果 4
  • 图神经网络与因果推理

    传统的因果推理基于线性结构方程模型 深度因果推理模型 这是基于图神经网络的模型 利用扁粉自动编码机来学习模型 其中 网络结构 因果推理模型为
  • iOS的终端命令和linux命令,iOS 终端 shell 操作,Mac 操作快捷键

    shell 操作命令 简单的shell 命令操作指令 pwd 当前工作目录 cd 不加参数 进root cd folder 进入文件夹 cd 上级目录 cd 返回root cd 返回上一个访问的目录 rm 文件名 删除 文件 rm 删除当前
  • vscode 配置文件

    将设置放入此文件中以覆盖默认设置 editor fontSize 18 editor fontFamily Source Code Pro Noto Sans CJK SC Consolas editor rulers 120 editor
  • 监听文件读取进度,中断文件读取

  • 使某个dom元素匀速滑动到容器顶部

    需求 我有个侧面的菜单 点击对应的菜单标题 可以让左侧的容易里对应标题滑到最顶上 于是我封装了一个缓动函数 这个函数接受3个参数 需要滚动的最外层的容器 滚动到什么距离 滚动时间 注意点 第一个参数的最外层的容器 需要滚动条 没滚动条是没有
  • Java AOP有5种增强方式注解——前置@Before,后置@After,返回@AfterReturning,异常@AfterThrowing,环绕@Around

    执行顺序 前置增强 gt 目标函数 gt 后置增强 gt 返回增强 异常增强 注意 Before After AfterRunning和 AfterThrowing修饰的方法没有返回值 而 Around修饰的方法必须有返回值 Aspect
  • 使用html制作3D循环相册

    使用 html 制作简单3D循环相册 注 img 标签中的 src 属性为你图片资源路径
  • typescript学习笔记

    typescript学习笔记 一 简介 typescript是js的超集 主要学习ts里面的原始类型 字面量类型 数组类型 函数类型 类类型 接口类型 类型别名 联合交叉类型 枚举类型 泛型等类型元素 以及类型推断 类型断言 类型缩小 类型
  • 开发BLE蓝牙手机上位机软件竟是如此的简单

    做安卓手机APP通常使用高端大气的Android Studio 开发语言是Java 该开发IDE就是体积大 学习成本高 入手慢 这里给大家推荐一款国产的软件 体积小 运行和编译速度快 最重要的是编程语言是中文 这个软件就是E4A 本次我将向
  • 【手把手】如何使用置信学习cleanlab对数据集进行去噪

    开源代码 https gitee com qq874455953 cleanlab nlp keras 目前可能是数据集选的不好 数据集本身没什么噪声 所以有点小问题 不过总体框架是搭建起来的 前言 在做一个项目的时候 发现数据集噪声非常多
  • Flink 多流转换 (五) 间隔联结(Interval Join)

    文章目录 间隔联结的调用 间隔联结实例 顾名思义 间隔联结的思路就是针对一条流的每个数据 开辟出其时间戳前后的一段时间间隔 看这期间是否有来自另一条流的数据匹配 间隔连接通过一个共同的key连接两个流 A B 中的数据 流 B 的数据具有时
  • 小红书sign算法-python实现

    coding utf 8 import hashlib def md5hex word if isinstance word unicode word word encode utf 8 elif not isinstance word s
  • git submodule拉取子模块最新代码

    转载请注明出处 https blog csdn net hhhhhhhhhhkkkkkkkkkk article details 122698629 之前由于对git子模块操作不熟悉 碰到子模块更新代码了本地死活拉取不到最新代码的问题 在网
  • 快速下载arxiv论文

    国内镜像站 http xxx itp ac cn 获得需要下载的论文id号 官网上会显示论文id 例如下载论文GAN的id为 1406 2661 那么 直接在浏览器上访问网址 http xxx itp ac cn pdf 1406 2661
  • 国密SKF库调用开发指南(一)

    针对支持国密算法USB KEY设备的应用 国家颁布一个行业标准 智能密码钥匙应用接口规范 GM T0016 2012 市面上销售的国密算法的USB KEY设备也都 其实也是必须 支持这个接口规范 因此 只要根据这个规范开发的应用程序 就可以
  • 李开复:数位革命——创新创业的黄金时代

    李开复 数位革命 创新创业的黄金时代 创新工场观点 数位革命 今天的创业时代比任何一个历史时期都能带来更多的机会 何谓 数位革命 看创新工场创始人 董事长兼首席执行官李开复老师如何从我们身处这个时代的六个现象中 看出变革 看出机会 未来是年
  • Vue脚手架的使用

    1 全局安装 vue cli 仅第一次执行 npm install g vue cli 再次输入vue 如果出现版本号 则成功 2 切换到要创建项目的目录 使用命令创建项目 vue create xxxx 3 启动项目 npm run se
  • Egret的2D摄像机实现

    一个Egret的正交摄像机的简单实现 主要功能大致如下 可参考根据实际进行调整 module Camera 一个正交摄像机demo export class Camera 摄像机显示的对象 实际是镜头所对应的世界 m container e