В разработке игр на Phaser правильная работа с разными соотношениями сторон экрана является критически важной для обеспечения корректного отображения игровых объектов на устройствах с разными размерами экранов. Соотношение сторон определяется как отношение ширины к высоте экрана и влияет на масштабирование сцены и позиционирование спрайтов.
Phaser предоставляет гибкие инструменты для управления этим процессом, главным образом через систему масштабирования (Scale Manager).
Phaser 3 использует объект scale в конфигурации игры для
управления размерами канваса и поведения сцены при изменении размеров
окна.
Пример конфигурации:
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);
Ключевые параметры scale:
mode — определяет способ масштабирования сцены.
Основные режимы:
Phaser.Scale.NONE — без масштабирования, сцена
фиксированного размера.Phaser.Scale.FIT — масштабирует сцену так, чтобы она
полностью помещалась в окно, сохраняя пропорции.Phaser.Scale.ENVELOP — сцена заполняет всё окно,
возможна обрезка.Phaser.Scale.RESIZE — размеры сцены изменяются вместе с
размерами окна, без сохранения исходных пропорций.autoCenter — автоматическое центрирование сцены:
Phaser.Scale.CENTER_BOTH — по горизонтали и
вертикали.Phaser.Scale.CENTER_HORIZONTALLY — только по
горизонтали.Phaser.Scale.CENTER_VERTICALLY — только по
вертикали.Phaser.Scale.NO_CENTER — центрирование отключено.Использование Phaser.Scale.FIT позволяет корректно
отображать сцену на устройствах с разными размерами экрана, не искажая
графику.
Даже при правильном масштабировании сцены могут потребоваться дополнительные корректировки позиции и размеров спрайтов. Phaser поддерживает работу с процентными координатами, что упрощает адаптацию объектов под разные экраны.
Пример использования процентных координат:
const sprite = this.add.sprite(
this.scale.width * 0.5,
this.scale.height * 0.5,
'player'
);
sprite.setScale(Math.min(
this.scale.width / 800,
this.scale.height / 600
));
Объяснение:
this.scale.width * 0.5 и
this.scale.height * 0.5 — центрирование спрайта
относительно текущего размера сцены.setScale с использованием минимального коэффициента
ширины и высоты сохраняет исходное соотношение сторон спрайта.Такой подход предотвращает растягивание или сжатие графики на экранах с нестандартными пропорциями.
Phaser позволяет динамически реагировать на изменения размеров окна
через события resize объекта
Scale Manager:
this.scale.on('resize', (gameSize, baseSize, displaySize, resolution) => {
const width = gameSize.width;
const height = gameSize.height;
sprite.setPosition(width * 0.5, height * 0.5);
});
Параметры события:
gameSize — текущие размеры сцены.baseSize — базовый размер, заданный в
конфигурации.displaySize — размеры видимой области канваса.resolution — коэффициент плотности пикселей (DPI).Использование этого события позволяет поддерживать корректное позиционирование и масштабирование объектов при динамическом изменении размеров окна, что особенно важно для веб-игр на мобильных устройствах.
Фоновые изображения обычно требуют особого внимания, чтобы избежать
растяжения. Для этого используется метод
setDisplaySize:
const background = this.add.image(0, 0, 'background').setOrigin(0, 0);
background.setDisplaySize(this.scale.width, this.scale.height);
Особенности:
setOrigin(0, 0) — привязка к верхнему левому углу
сцены.setDisplaySize растягивает изображение на весь экран,
что подходит для фоновых элементов. Для сохранения пропорций можно
использовать setScale с расчетом минимального
коэффициента.Для сложной графики лучше использовать 9-slice или тайловые спрайты, которые автоматически подстраиваются под размер сцены.
FIT или RESIZE —
позволяет сцене подстраиваться под экран.resize — обеспечивает гибкость.setScale с минимальным коэффициентом ширины и высоты.Такой подход позволяет разрабатывать игры на Phaser с единым кодом для множества устройств, обеспечивая корректное отображение и удобство взаимодействия.