cocos creator屏幕适配fitHeight / fitWidth,手机端竖屏,pc端浏览器适配,pc分辨率全屏适配,血条跟随的适配
一,使用creator3.3.2 分别实现手机端和浏览器的适配效果如下 打包web-mobile(居然会有这种需求 /流汗!)
pc浏览器显示
手机端显示
1、首先在项目中设置分辨率 和默认适配 这里是750*1334,默认以宽度来适配
设置Canvas的widget适配,代码挂在Canvas下,pcBg是pc浏览器显示的如图蓝色区域,代码如下
@property(Node)pcBg: Node = null;onLoad() {let design = view.getDesignResolutionSize(); // 设计分辨率,。就是设置的 750 1334 根据不同端做适配if(!sys.isMobile){// pc端view.setDesignResolutionSize(design.width, design.height, ResolutionPolicy.FIXED_HEIGHT);}else{// 手机端view.setDesignResolutionSize(design.width, design.height, ResolutionPolicy.FIXED_WIDTH);}this.updateSizeFit();let _this = this;// 监听浏览器窗口大小变化view.setResizeCallback(function () {_this.updateSizeFit();// rect.left, rect.top, rect.width, rect.height (像素值)});}// 根据浏览器窗口变化适配updateSizeFit() {var rect = view.getVisibleSize();// 获取实际显示的尺寸var design = view.getDesignResolutionSize();// 获取设计分辨率let wi = this.node.getComponent(Widget);// 设置手机端和pc端canvas的显示位置,在pc是横屏的,但是canvas应该是中间的手机位置。所以要左右减 // 实际屏幕宽度的一半减去手机屏宽的一半,就是pcBg距离Canvas左侧的距离if (!sys.isMobile) { // pc端加背景图,实现中间显示手机界面wi.right = rect.width/2-(rect.height*design.width/design.height)/2;wi.left = rect.width/2-(rect.height*design.width/design.height)/2;wi.top = 0;wi.bottom = 0;wi.updateAlignment();}else{ // 手机端 屏幕宽度高,就是canvas的宽高。,距离是0就可以wi.right = 0;wi.left = 0;wi.top = 0;wi.bottom = 0;wi.updateAlignment();}// pc大背景全屏显示,大背景图平铺到pc上,相对于canvas 左右都是负的宽的的一半var widget = this.pcBg.getComponent(Widget)widget.right = -rect.width/2;widget.left = -rect.width/2;widget.top = 0;widget.bottom = 0;widget.target = this.node;widget.updateAlignment();}
2、因为我为了防止近大远小,所以照射角色的相机改成了正交相机
3、还是根据camera的targetTexture,把3d投射到2d显示,把RenderTexture赋值给camera和ui要显示投射的sprite,代码如下
start() {
// 投影 吧3d照射的投影到2d ui上
const renderTex = this.render;
this.cam.targetTexture = renderTex;
this.show3d.spriteFrame.texture = renderTex;
}
4、实现血条跟随主角 ,既然跟随,那血条ui就不能加widget, player3dHps是所有玩家的3d下的血条挂点位置,uiHps是所有血条的sprite,通过worldToScreen,把世界坐标转到ui上的位置,再赋值给血条ui
this.player3dHps.forEach((item, i) => {
// 血条
let ve1 = new Vec3(0, 0, 0)
this.cam.worldToScreen(item.worldPosition, ve1);
this.uiHps[i].worldPosition = ve1
})
但是最终的结果在手机端显示没问题,pc端却是这样的效果
那是因为pc端我们的canvas是中间手机位置,世界坐标转屏幕后,是相对于可是蓝色区域的,不是手机canvas深蓝区域的,所以要+(canvas的widget的左侧偏移-中间canvas区域的宽的一半)这区域
let canvasWidget = find("Canvas").getComponent(Widget)
this.uiHps[i].worldPosition = ve1.add(new Vec3(canvasWidget.left,0,0));
就能得到正确位置了
实际显示在手机还有一些小问题,因为手机端是按照宽度适配的,在实际的屏幕高度和设计高度是不一样,因为如果实际手机屏幕比设计高度要高,会导致血条位置高于头顶很多,先看代码
let canvasWidget = find("Canvas").getComponent(Widget)
let offsetHeight = !sys.isMobile?0: ((view.getVisibleSize().width*design.height/design.width)-view.getVisibleSize().height);// 计算出高度比实际分辨率的差距,
this.uiHps[i].worldPosition = ve1.add(new Vec3(canvasWidget.left,-offsetHeight/2,0));
可以理解为在1334高度下血条y是100,在1600下可能是120,导致超过头顶位置正常值,有时间的同学可以调试一下这个offsetHeight,在手机浏览器上看看就明白了
项目地址 中的 GitHub - SuiFengErQu/cocos-creator3d-mini_demo: cocos creator3.3.2练手小功能 adaptationScreen场景
二、pc端浏览器全屏适配,看代码就明白了,设计分辨率是1920*1280,使用cocos creator2.4.4
测试一下图片 基于Canvas 对齐
onLoad() {this.updateSizeFit();let _this = this;// 监听浏览器窗口大小变化cc.view.setResizeCallback(function () {_this.updateSizeFit();// rect.left, rect.top, rect.width, rect.height (像素值)});} // 根据浏览器窗口变化适配updateSizeFit() {var rect = cc.game.canvas.getBoundingClientRect();let rateWidth = Math.round(rect.width / 1920 * 100) / 100;let rateHeight = Math.round(rect.height / 1080 * 100) / 100;// console.log("屏幕发生变化", rateWidth, rateHeight) 手机端和pc参数不同if (Math.abs(rateWidth - rateHeight) > (GameConfig.getPlatform(true)===GameConfig.PLATFORM.PC?0.2:0.5) || rateWidth == rateHeight) {// 宽高差距太大或者宽高比=,不做适配cc.Canvas.instance.fitHeight = false;cc.Canvas.instance.fitWidth = false;UIModalMgr.inst.updateMaskView();// 更新popUI mask大小EventCenter.emit(EventCenterNameEnum.ScreenChange);return;}if (rateWidth < rateHeight) {cc.Canvas.instance.fitHeight = false;cc.Canvas.instance.fitWidth = true;}else if (rateHeight < rateWidth) {cc.Canvas.instance.fitHeight = true;cc.Canvas.instance.fitWidth = false;}UIModalMgr.inst.updateMaskView();// 更新popUI mask大小EventCenter.emit(EventCenterNameEnum.ScreenChange);}
这里实际上就是 计算实际宽度和设计宽度的比例,实际高度和设计高度的比例
当比例一样,或者比例相减的绝对值大于0.2,那就不适配,否则会界面错乱,这里如果是手机端是》0.5,因为手机端的比例差距比较大,所以值调大一些,尽可能适配更多的手机。
如果宽度比例小,那就以宽来适配,否则以高来适配
剩下的就是界面上加widget来调了,可以看一下不同情况下显示效果
超过一定比例不再适配,直接部分被隐藏
手机端显示
cocos creator屏幕适配fitHeight / fitWidth,手机端竖屏,pc端浏览器适配,pc分辨率全屏适配,血条跟随的适配相关推荐
- html手机端背景显示不全,手机浏览器打开PC端网站,背景显示不全怎么办?
原标题:手机浏览器打开PC端网站,背景显示不全怎么办? 随着移动互联网的发展,大多数企业在制作网站的时候,为了兼容各种设备,会制作出PC端.移动端二种版,根据不同的设备跳转到不同的网站,从而实现用户体 ...
- 手机端和pc端浏览器兼容性问题
1⃣️ 如何解决不同浏览器的标签默认的内外补丁的不同: 解决方法: 在css里开头用通配符来设置内外补丁标签内外补丁为0: 2⃣️ 块元素设置float后,又有横行的margin情况下,在IE6中 ...
- 【Android RTMP】RTMP 直播推流阶段总结 ( 服务器端搭建 | Android 手机端编码推流 | 电脑端观看直播 | 服务器状态查看 )
文章目录 安卓直播推流专栏博客总结 一. 服务器搭建 二. 手机端推流 三. 电脑端观看直播 四. RTMP 服务器端状态 安卓直播推流专栏博客总结 Android RTMP 直播推流技术专栏 : 0 ...
- linux smb视频,利用 CentOS 7 samba 服务器与 ES 文件浏览器实现手机端在线播放电脑端视频...
环境 以下环境仅代表本文测试环境,其它版本应该也可以. 虚拟机 Linux: CentOS Linux release 7.4.1708 (Core) 物理机 Windows: Windows 10 ...
- 微信公众号授权手机端可以,电脑端显示空白
微信公众号授权手机端可以,电脑端显示空白 在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_use ...
- 手机端原生H5video 和QQ浏览器 兼容性
<ul class="pho_ved_list" id="photo"> <?php $index=0;?> <?php if ( ...
- (淘宝无限适配)移动手机端rem布局详解(转载非原创)
https://www.cnblogs.com/well-nice/p/5509589.html (淘宝无限适配)手机端rem布局详解(转载非原创) 从网易与淘宝的font-size思考前端设计稿与工 ...
- vue怎么给pc端浏览器设置一个最小屏幕_图文讲解uni-app的PC宽屏适配方案
天下苦平台碎片化已久. 在移动互联网以前,开发者只需幸福的面对web.进入移动互联网时代,iOS.Android.H5以及各种小程序快应用层出不穷,开发者再也幸福不起来. 学习n个技术 开发n个版本 ...
- pc变手机端html,让移动端的事件变为PC端的事件
最近看到了一个手机端的小程序,可是在电脑端无法使用,原因是其中一个js是手机端js,怎么将这个js专为PC端可以使用的js function tabLoad(obj,oJson){ var This= ...
最新文章
- 跳槽,你心脚同步吗?
- 新泰成为全国智慧城市时空信息云平台建设试点
- android搭建开发环境
- 浅谈:数据结构之单链表,java代码演示单链表
- Communicator可以多点同时Logon
- 黄金为什么贵,黄金都有什么用处?
- unity runtime时导入fbx文件
- 局域网屏幕共享_【宅家宝典】将手机屏幕搬上电视,只需解锁一个技能!
- Spring Cloud技术栈简述
- excel之天数转年月日
- 查看linux负载的情况
- 淘系页面详情API调用展示
- 2008 NBA 全明星周未之扣篮大赛
- 嵌入式系统硬件设计与实践(学习方法)
- CSS 渐变色 (超好看)
- ZYNQ PS与PL通信之DMA
- 简易的三子棋游戏(C语言)
- middel在c语言中的作用,Middle和medium的区别
- SQLserver数据库恢复的几种方法
- 三国志战略版S2开荒攻略
热门文章
- 搭档之家:木材已成为疫情冲击下对冲新贵 忘掉黄金吧!伐木头养你~
- flutter图片聊天泡泡_Flutter 气泡效果合集(全网最全)
- Python max函数
- MathType中/英文版下载地址汇总(适用于Mathtype6.9)
- 如何选择企业级数据存储DAS、NAS和SAN
- 秦疆 西部开源_Win10下安装Hadoop3.1.2详解
- 在java中如何让背景图片连续不断地滚动_JS实现图片的不间断连续滚动
- ps4看直播 HTML,ps4直播教学 怎么样才能直播
- 2019-04-07 Python之利用PIL改变图片颜色和生成手绘图
- 2023年前端面试题集锦