前言
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)