[phaser]利用相机进行移动端适配

3,358 阅读2分钟

前言

phaser是一个开源2d游戏框架, 在phaser开发中, 你是否有思考过如何才能做 类似移动端vw适配, 开发时直接按照设计稿的坐标与尺寸构建UI就好, 那么你可以参考本篇的适配方案

ps: vw适配方案请见我的掘金文章: 从一个祖传项目谈移动端vw适配

以终为始

先看适配方案的最终效果, 以下为同一套代码在手机和pad里的效果

示意图, 这是一般标准的设计稿尺寸, iPhone 678, 375x667

这是减去了刘海的模拟iPhoneX, 375x812

这是竖屏版iPad mini, 768x1024

这是横屏版iPad mini, 1024x768

开发时, 我们添加元素, 设置其坐标为(0, 0), 如果其原点也为(0, 0), 其左上角就在蓝色框内区域的左上角

核心概念

1.内容区: 上图中蓝色框内区域, 主要的交互内容UI呈现区域

2.背景区: 上图中红色框内区域, 放置背景和返回按钮等非主要的交互内容UI

3.视口: 屏幕的可见区域

适配方案总结

1.如果是窄屏, 则以 屏幕的宽 / 375 为比例缩放, 上下垂直居中

2.如果是宽屏, 则以 屏幕的高 / 667 为比例缩放, 左右水平居中

主要代码

show code

// 相机的缩放比
let zoom: nubmer = 1
// 背景区缩放以后的左上角x坐标
let backgroundRectX: nubmer = 0
// 背景区缩放以后的左上角Y坐标
let backgroundRectY: nubmer = 0
const designWidth: nubmer = 375
const designHeight: nubmer = 667
const designRatio: nubmer = designWidth / designHeight
const viewRatio: nubmer = window.innerWidth / window.innerHeight
// 根据设计稿的宽高比与视口的宽高比判断缩放的基准
if (designRatio > viewRatio) {
  // 以宽为基准做缩放
  zoom = window.innerWidth / this.designWidth
  backgroundRectY = -(window.innerHeight / zoom - designHeight) / 2
} else {
// 以高为基准做缩放
  zoom = window.innerHeight / designHeight
  backgroundRectX = -(window.innerWidth / zoom - designWidth) / 2
}
const camera: Phaser.Cameras.Scene2D.Camera = this.cameras.main
// 相机缩放
cameras.setZoom(zoom)
// 相机移动
camerassetScroll(-(window.innerWidth - designWidth) / 2, -(window.innerHeight - designHeight) / 2)