我正在使用 HTML5、canvas 和 WinJS 为 Windows 8 创建游戏。游戏即将完成,一切正常。但是,我将继续研究图形,并开始关注我实现对不同分辨率的支持的方式。在我开始这个项目的时候,我已经阅读了很多关于如何处理分辨率的信息,尽管很少与画布相关。我最终实现了这样的东西:
if (window.innerWidth >= 2560 && window.innerHeight >= 1440) { //Full 2560x1440(16:9) / Letterbox 2560x1600(16:10)
canvas.width = 2560;
canvas.height = 1440;
} else if (window.innerWidth >= 1920 && window.innerHeight >= 1080) { //Full 1920x1080(16:9) / Letterbox 1920x1200(16:10)
canvas.width = 1920;
canvas.height = 1080;
} else if (window.innerWidth >= 1600 && window.innerHeight >= 900) { //Full 1600x900(16:9) / Border 1680x1050(16:10)
canvas.width = 1600;
canvas.height = 900;
} else if (window.innerWidth >= 1360 && window.innerHeight >= 768) { //Full 1366x768(16:9) / Border 1440x900 (16:10) / Cut 1360x768(<16:9)
canvas.width = 1366;
canvas.height = 768;
} else if (window.innerWidth >= 1280 && window.innerHeight >= 720) { //Full 1280x720(16:9) / Letterbox 1280x768(<16:9) / Letterbox 1280x800(16:10) / Letterbox 1280x1024(5:4)
canvas.width = 1280;
canvas.height = 720;
} else { //Letterbox 1024x768(4:3)
canvas.width = 1024;
canvas.height = 575;
}
pixelScale = canvas.height / 768;
assetScale = canvas.height;
它背后的基本思想是它在给定的分辨率下找到最适合画布的尺寸(在屏幕比例不同的情况下使用信箱)。然后将assetScale应用于清单中的所有图像,以便PreloadJS加载正确大小的位图(例如images/1080/myimage.png),并且pixelScale用于将坐标从1366x768的工作分辨率缩放到操作分辨率(所以事情在其他分辨率上正确定位)。
但是,我不再确定这是否真的是处理它的最佳/正确方法,以及我是否可能过于复杂。在 body 元素中添加了一个类来帮助缩放菜单元素后,我突然注意到在 Blend for VS2012 中,高 DPI 设备(即 1920x1080 @ 140%)将分辨率选为 768 而不是 1080。这不会导致降低高 DPI 设备的视觉效果?我是否需要单独考虑这一点,如果需要,如何处理?还是我只是忽略了什么?
我遇到的其他方法包括以高分辨率渲染整个画布元素,然后缩小整个画布元素(再次降低视觉效果?)并让 WinJS 通过附加带有“-100”、“-140”和“-180”(似乎这只适用于内联/css图像而不是canvas/PreloadJS)。
有人可以指出我如何处理这个问题的正确方向吗?似乎有很多错误信息。最后,我只想确保所有用户都能获得适合他们计算机/设备分辨率的最佳质量图像。非常感谢