如何使用 Phaser.js 获得类似于 Slither.io 的屏幕缩放比例?
How can I obtain screen scaling similar to Slither.io's using Phaser.js?
我正在 Javascript 中使用 Phaser.js 引擎作为后端编写一个小游戏。然而,知道这是可能的,屏幕缩放问题已被证明是一个
最困难的一面。
Slither.io 扩展以填满整个屏幕,并保持比例。我也想将其用作我自己的缩放方法,但示例似乎相当稀少。
我遇到的都不是很清楚
这两个函数是我到目前为止想出的,但它们似乎会使精灵匹配 window 比例 - 不保持比例和比例。
function resizeWindow()
{
game.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL;
game.width = window.innerWidth * window.devicePixelRatio;
game.height = window.innerHeight * window.devicePixelRatioz;
gameScale = game.width / game.height;
if (game.height > game.width){
gameScale = (game.height / 300);
} else {
gameScale = (game.width / 480);
}
//game.scale.pageAlignVertically = true;
game.scale.pageAlignHorizontally = true;
game.scale.refresh();
gameScaleManager();
}
function gameScaleManager()
{
for(var i = 0; i < spriteList.length; i++)
{
spriteList[i].scale.setTo(gameScale, gameScale);
}
}
我终于通过一些事情解决了它
首先,将您的游戏比例模式设置为:
game.scale.scaleMode = Phaser.ScaleManager.RESIZE;
and then apply
game.scale.pageAlignVertically = true;
这很重要,尤其是对于完整的 window 尺寸。
我不再依赖 jQuery 进行重新缩放,而是设置为:
game.scale.setResizeCallback(rescale);
rescale 方法处理屏幕缩放。
最后,此方法与 "RESIZE" 缩放模式一起处理实际工作,这将影响它的工作方式。根据我所做的实验,EXACT_FIT 和其他人倾向于强制分辨率与 window 相同。
function rescale()
{
var windowHeight = window.innerHeight;
var windowWidth = window.innerWidth;
baseWidth = windowWidth * (gameHeight / windowHeight);
baseHeight = gameHeight;
if (windowHeight > windowWidth)
{
systemScale = (windowHeight / baseHeight) / 1.8;
} else {
systemScale = (windowWidth / baseWidth) / 1.8;
}
skyBackgroundGroup.scale.setTo(systemScale * (window.innerWidth - DPR / window.innerWidth - DPR) / 100 * 1, systemScale * 2.1);
MasterControlGroup.scale.setTo(systemScale / 0.98, systemScale / 0.98);
}
分度为1.8和0.98完全是个人喜好。
我几乎忘记了其中最重要的部分——让你的相机聚焦在你正在观看的中心物体上。
我正在 Javascript 中使用 Phaser.js 引擎作为后端编写一个小游戏。然而,知道这是可能的,屏幕缩放问题已被证明是一个 最困难的一面。
Slither.io 扩展以填满整个屏幕,并保持比例。我也想将其用作我自己的缩放方法,但示例似乎相当稀少。 我遇到的都不是很清楚
这两个函数是我到目前为止想出的,但它们似乎会使精灵匹配 window 比例 - 不保持比例和比例。
function resizeWindow()
{
game.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL;
game.width = window.innerWidth * window.devicePixelRatio;
game.height = window.innerHeight * window.devicePixelRatioz;
gameScale = game.width / game.height;
if (game.height > game.width){
gameScale = (game.height / 300);
} else {
gameScale = (game.width / 480);
}
//game.scale.pageAlignVertically = true;
game.scale.pageAlignHorizontally = true;
game.scale.refresh();
gameScaleManager();
}
function gameScaleManager()
{
for(var i = 0; i < spriteList.length; i++)
{
spriteList[i].scale.setTo(gameScale, gameScale);
}
}
我终于通过一些事情解决了它
首先,将您的游戏比例模式设置为:
game.scale.scaleMode = Phaser.ScaleManager.RESIZE;
and then apply
game.scale.pageAlignVertically = true;
这很重要,尤其是对于完整的 window 尺寸。 我不再依赖 jQuery 进行重新缩放,而是设置为:
game.scale.setResizeCallback(rescale);
rescale 方法处理屏幕缩放。
最后,此方法与 "RESIZE" 缩放模式一起处理实际工作,这将影响它的工作方式。根据我所做的实验,EXACT_FIT 和其他人倾向于强制分辨率与 window 相同。
function rescale()
{
var windowHeight = window.innerHeight;
var windowWidth = window.innerWidth;
baseWidth = windowWidth * (gameHeight / windowHeight);
baseHeight = gameHeight;
if (windowHeight > windowWidth)
{
systemScale = (windowHeight / baseHeight) / 1.8;
} else {
systemScale = (windowWidth / baseWidth) / 1.8;
}
skyBackgroundGroup.scale.setTo(systemScale * (window.innerWidth - DPR / window.innerWidth - DPR) / 100 * 1, systemScale * 2.1);
MasterControlGroup.scale.setTo(systemScale / 0.98, systemScale / 0.98);
}
分度为1.8和0.98完全是个人喜好。 我几乎忘记了其中最重要的部分——让你的相机聚焦在你正在观看的中心物体上。