一,使用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分辨率全屏适配,血条跟随的适配相关推荐

  1. html手机端背景显示不全,手机浏览器打开PC端网站,背景显示不全怎么办?

    原标题:手机浏览器打开PC端网站,背景显示不全怎么办? 随着移动互联网的发展,大多数企业在制作网站的时候,为了兼容各种设备,会制作出PC端.移动端二种版,根据不同的设备跳转到不同的网站,从而实现用户体 ...

  2. 手机端和pc端浏览器兼容性问题

    1⃣️  如何解决不同浏览器的标签默认的内外补丁的不同: 解决方法: 在css里开头用通配符来设置内外补丁标签内外补丁为0: 2⃣️  块元素设置float后,又有横行的margin情况下,在IE6中 ...

  3. 【Android RTMP】RTMP 直播推流阶段总结 ( 服务器端搭建 | Android 手机端编码推流 | 电脑端观看直播 | 服务器状态查看 )

    文章目录 安卓直播推流专栏博客总结 一. 服务器搭建 二. 手机端推流 三. 电脑端观看直播 四. RTMP 服务器端状态 安卓直播推流专栏博客总结 Android RTMP 直播推流技术专栏 : 0 ...

  4. linux smb视频,利用 CentOS 7 samba 服务器与 ES 文件浏览器实现手机端在线播放电脑端视频...

    环境 以下环境仅代表本文测试环境,其它版本应该也可以. 虚拟机 Linux: CentOS Linux release 7.4.1708 (Core) 物理机 Windows: Windows 10 ...

  5. 微信公众号授权手机端可以,电脑端显示空白

    微信公众号授权手机端可以,电脑端显示空白 在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_use ...

  6. 手机端原生H5video 和QQ浏览器 兼容性

    <ul class="pho_ved_list" id="photo"> <?php $index=0;?> <?php if ( ...

  7. (淘宝无限适配)移动手机端rem布局详解(转载非原创)

    https://www.cnblogs.com/well-nice/p/5509589.html (淘宝无限适配)手机端rem布局详解(转载非原创) 从网易与淘宝的font-size思考前端设计稿与工 ...

  8. vue怎么给pc端浏览器设置一个最小屏幕_图文讲解uni-app的PC宽屏适配方案

    天下苦平台碎片化已久. 在移动互联网以前,开发者只需幸福的面对web.进入移动互联网时代,iOS.Android.H5以及各种小程序快应用层出不穷,开发者再也幸福不起来. 学习n个技术 开发n个版本 ...

  9. pc变手机端html,让移动端的事件变为PC端的事件

    最近看到了一个手机端的小程序,可是在电脑端无法使用,原因是其中一个js是手机端js,怎么将这个js专为PC端可以使用的js function tabLoad(obj,oJson){ var This= ...

最新文章

  1. 跳槽,你心脚同步吗?
  2. 新泰成为全国智慧城市时空信息云平台建设试点
  3. android搭建开发环境
  4. 浅谈:数据结构之单链表,java代码演示单链表
  5. Communicator可以多点同时Logon
  6. 黄金为什么贵,黄金都有什么用处?
  7. unity runtime时导入fbx文件
  8. 局域网屏幕共享_【宅家宝典】将手机屏幕搬上电视,只需解锁一个技能!
  9. Spring Cloud技术栈简述
  10. excel之天数转年月日
  11. 查看linux负载的情况
  12. 淘系页面详情API调用展示
  13. 2008 NBA 全明星周未之扣篮大赛
  14. 嵌入式系统硬件设计与实践(学习方法)
  15. CSS 渐变色 (超好看)
  16. ZYNQ PS与PL通信之DMA
  17. 简易的三子棋游戏(C语言)
  18. middel在c语言中的作用,Middle和medium的区别
  19. SQLserver数据库恢复的几种方法
  20. 三国志战略版S2开荒攻略

热门文章

  1. 搭档之家:木材已成为疫情冲击下对冲新贵 忘掉黄金吧!伐木头养你~
  2. flutter图片聊天泡泡_Flutter 气泡效果合集(全网最全)
  3. Python max函数
  4. MathType中/英文版下载地址汇总(适用于Mathtype6.9)
  5. 如何选择企业级数据存储DAS、NAS和SAN
  6. 秦疆 西部开源_Win10下安装Hadoop3.1.2详解
  7. 在java中如何让背景图片连续不断地滚动_JS实现图片的不间断连续滚动
  8. ps4看直播 HTML,ps4直播教学 怎么样才能直播
  9. 2019-04-07 Python之利用PIL改变图片颜色和生成手绘图
  10. 2023年前端面试题集锦