首页 > 其他分享 >Cocos 2.x- 屏幕适配、对齐策略

Cocos 2.x- 屏幕适配、对齐策略

时间:2023-11-04 22:35:20浏览次数:39  
标签:node Cocos const cc 适配 分辨率 canvas 对齐

《Cocos 2.x-Hello World 飞机大战游戏》,简单实现了一个Cocos 2.x Hello World 程序,但是在不同的机型的运行效果,会出现黑边的情况,在查看Cocos Creator的手册之后,发现了一个简单的解决方案,这里记录一下处理过程。

1. 环境搭建

为了不对原来的代码进行大的调整,这里单独创建了一个新的游戏场景进行测试,相关场景资源如下:

2. 多分辨率适配方案

在多分辨率适配方案中,官方文档提供了方案说明:

https://docs.cocos.com/creator/2.4/manual/zh/ui/multi-resolution.html

总结一下主要有两点吧:

  1. 设计分辨率宽高比大于屏幕分辨率,适配高度避免黑边
  2. 设计分辨率宽高比小于屏幕分辨率,适配宽度避免黑边

这里的设计分辨率就是Canvas中的Design Resolution获取得到,至于屏幕分辨率,目前还不是很熟悉API,暂时使用cc.winSize获取。

在上图的游戏脚本中,新增了一个GameSettingCC用于动态调整上诉的两种方案:

const { ccclass, property } = cc._decorator;
@ccclass
export default class GameSettingCC extends cc.Component {
  onl oad() {
    const canvas = this.node.getComponent(cc.Canvas);
    const dr = canvas.designResolution.width / canvas.designResolution.height;
    const wr = cc.winSize.width / cc.winSize.height;
    if (dr > wr) {
      canvas.fitHeight = true;
      canvas.fitWidth = false;
    } else {
      canvas.fitHeight = false;
      canvas.fitWidth = true;
    }
    cc.log("dr=" + dr, "wr=" + wr);
    cc.log("fitHeigh=" + canvas.fitHeight, "fitWidth=" + canvas.fitWidth);
  }
}

这个脚本挂在Canvas上,这样可以初步解决不同机型(分辨率不同)显示出现黑边的问题。

3. 对齐策略

通过简单地通过调整fitHeight或fitWidth可以适配不同分辨率的问题,但是无法解决UI元素在Canvas中的相对位置,在官方文档中发现对其策略,可以用来解决这个问题,官方文档地址:

https://docs.cocos.com/creator/2.4/manual/zh/ui/widget-align.html

在飞机大战游戏中,分数这个UI元素就需要通过这种策略,来适配不同的分辨率问题:

score这个Label UI元素加上Widget组件,并调整其Top和Left为25px,

通过Widget配置边距,就可以解决不同分别率下,score这个Label的位置错乱问题。

4. 位置计算

在新的游戏场景中,将所有节点元素都作为Canvas的子节点,一些计算需要调整一下,主要是坐标中心变了。

const { ccclass, property } = cc._decorator;

@ccclass
export default class PlayerCC extends cc.Component {
  minX: number;
  maxX: number;
  minY: number;
  maxY: number;

  moving: boolean = false;

  onl oad() {
    const size = cc.winSize;
    cc.log(size.width, size.height);
    this.maxX = size.width / 2;
    this.minX = -this.maxX;
    this.maxY = size.height / 2;
    this.minY = -this.maxY;
  }

  start() {
    this.initializeTouchEvent();
  }

  initializeTouchEvent() {
    this.node.on(cc.Node.EventType.TOUCH_START, () => (this.moving = true));
    this.node.on(cc.Node.EventType.TOUCH_END, () => (this.moving = false));
    this.node.on(cc.Node.EventType.TOUCH_MOVE, (e: cc.Event.EventTouch) => {
      if (this.moving) {
        let x = e.getLocationX() - this.maxX;
        let y = e.getLocationY() - this.maxY;
        cc.log(e.getLocationX(), e.getLocationY());
        x = Math.max(this.minX + this.node.width / 2, x);
        x = Math.min(this.maxX - this.node.width / 2, x);

        y = Math.max(this.minY + this.node.height / 2, y);
        y = Math.min(this.maxY - this.node.height / 2, y);

        this.node.setPosition(x, y);
      }
    });
  }
}

这里可能还有更好的解决方案,但就目前对Cocos2.x的了解还不是很多,后续在慢慢阅读文档继续完善。

标签:node,Cocos,const,cc,适配,分辨率,canvas,对齐
From: https://www.cnblogs.com/michong2022/p/17809914.html

相关文章

  • 设计模式—结构型模式之适配器模式
    设计模式—结构型模式之适配器模式将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,适配器模式分为类结构型模式(继承)和对象结构型模式(组合)两种,前者(继承)类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少......
  • 记一个 Android 14 适配引发的Android 存储权限问题
    一、bug背景项目中有下面这样一段代码,在AndroidT版本运行正常,现在适配到AndroidU上之后,运行时crash了。。。。...values.put(MediaStore.Images.Media.DATA,file.absolutePath)values.put(MediaStore.Images.Media.DISPLAY_NAME,file.name)...resolver.update(ur......
  • 范围适配器的编译时大小
    与标准不同,think-cell的范围库已经原生支持编译时大小,因此我渴望尝试那里的习惯用法,看看它在实践中的效果如何。 namespacetc{ template<typenameRng> constexprautosize(Rng&&rng);//runtime-sizeofarange,likestd::ranges::size template<typename......
  • 在一个简单的pwn题目中探究执行系统调用前堆栈的对齐问题
    题目介绍:在输入AAAAAAAAAAAAAAAAAAAAAAAAA后,程序会打开一个shell,这是为什么?字符串中的A能否更换为@?1.程序接收输入AAAAAAAAAAAAAAAAAAAAAAAAA获得shell的原理:.text:0000000140001584publicvuln.text:0000000140001584vulnprocnear......
  • spi-flash 启动适配
    spi-flash启动适配 2022-07-06编辑本页   对于从spi-flash启动系统,需要对uboot/dts/内核配置都有所修改,打包与烧写请参考一键烧录及脚本使用说明以下将以16Mflash为例,介绍spiflash的适配过程。一、分区规划#下表为分区规划表:分区序号分区大小......
  • 分享一个HTML页面适配方式:用户手动缩放
    <metaname="viewport"content="width=device-width,initial-scale=1.0">这个配置告诉浏览器自动将页面的宽度设置为设备的宽度(通常是屏幕宽度),并将初始缩放比例设置为1.0。这通常用于确保网页在移动设备上以完整的屏幕宽度显示,而不需要用户手动缩放或调整。<metaname="viewpo......
  • ZEGO 即构科技首发适配鸿蒙系统的 Express SDK 1.0 版本
    ​ 2019年8月,华为在开发者大会上正式发布鸿蒙系统。HarmonyOS鸿蒙系统是一款“面向未来”、面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统。在传统的单设备系统能力的基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持......
  • uView组件库适配微信小程序
    1.打开官网 uView 官网2.在HbuilderX中集成插件sass,并新建项目。3.补充小程序id等信息后进行编译。4.根据官网下载-安装方式提示进行操作5.在HbuilderX中的工具→插件安装→插件市场安装将uView集成到你的小程序项目中去。(如果搜索不到可以直接点击uView中的链接下......
  • Cocos 2.x-Hello World 飞机大战游戏
    Java程序员Cocos2.x初体验(Helloworld),飞机大战游戏参考野生程序君教程1.环境搭建在Cocos官网下载CocosDashboard_2.0.1.exe,安装,启动后设置编辑的目录(默认情况下,编辑器安装在C盘中,每一个版本的编辑会占用较大的空间,所以这里将编辑器安装目录配置在的D盘)在安装列表中新增......
  • 设计模式03:原型模式、适配器模式、桥接模式、组合模式
    1.Prototype原型模式 代码示例:packagePrototype05;/***原型模式:*意图:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象*适用于:*当一个系统应该独立于它的产品创建、构成和表示时*当要实例化的类是在运行时刻指定时例如通过动态装......