В современных веб-играх динамическое изменение размеров экрана является критически важным для корректного отображения на разных устройствах. Библиотека Phaser предоставляет гибкие средства для обработки таких событий и адаптации игрового контента под новые размеры.
Phaser использует систему Scale Manager, которая отвечает за поведение игры при изменении размеров окна. Основные режимы масштабирования:
Пример конфигурации Scale Manager:
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
scale: {
mode: Phaser.Scale.FIT,
autoCenter: Phaser.Scale.CENTER_BOTH
},
scene: {
preload: preload,
create: create,
update: update
}
};
const game = new Phaser.Game(config);
Ключевой момент: использование
autoCenter: Phaser.Scale.CENTER_BOTH гарантирует, что игра
всегда будет центрирована в окне.
Phaser предоставляет событие resize через Scale
Manager, позволяющее реагировать на динамическое изменение
окна:
this.scale.on('resize', (gameSize, baseSize, displaySize, previousWidth, previousHeight) => {
const width = gameSize.width;
const height = gameSize.height;
// Пример: перерасположение игрового объекта
player.setPosition(width / 2, height / 2);
// Обновление камер
this.cameras.main.setViewport(0, 0, width, height);
});
Параметры события resize:
gameSize – новые размеры игрового канваса.baseSize – базовые размеры, заданные в конфиге.displaySize – размеры окна браузера.previousWidth, previousHeight – предыдущие
размеры канваса.Для корректного отображения объектов при изменении размеров рекомендуется использовать относительные позиции и размеры:
player.x = this.scale.width * 0.5;
player.y = this.scale.height * 0.8;
Использование коэффициентов позволяет сохранить правильное расположение элементов при любом размере окна.
Для спрайтов и текстов можно применять масштабирование через setScale:
player.setScale(this.scale.width / 800, this.scale.height / 600);
scoreText.setStyle({ fontSize: `${24 * this.scale.width / 800}px` });
Камеры Phaser не масштабируются автоматически с изменением окна. Необходимо обновлять viewport:
this.cameras.main.setViewport(0, 0, this.scale.width, this.scale.height);
Для более сложных сцен с параллакс-эффектами и слоями можно комбинировать масштабирование камер и позиционирование объектов.
this.scale.width и
this.scale.height.function resizeGame(scene) {
scene.scale.on('resize', (gameSize) => {
const width = gameSize.width;
const height = gameSize.height;
// Центрирование игрока
player.setPosition(width / 2, height / 2);
// Масштабирование UI
scoreText.setStyle({ fontSize: `${24 * width / 800}px` });
scoreText.setPosition(width - 150, 50);
// Масштабирование контейнера
uiContainer.setScale(width / 800, height / 600);
// Обновление камеры
scene.cameras.main.setViewport(0, 0, width, height);
});
}
Этот подход обеспечивает корректную адаптацию всех ключевых элементов игры под любые изменения размера окна, сохраняя пропорции и расположение объектов.