О чем этот пример
При создании игровых интерфейсов, инвентаря или мини-карт часто возникает задача вписать изображение в заданные рамки. Ручной подбор масштаба через `setScale` — это долго и неточно. Метод `setDisplaySize` решает эту проблему, автоматически рассчитывая нужный масштаб под целевые размеры в пикселях. В этой статье разберем, как им пользоваться для точного позиционирования графики.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('frame', 'assets/pics/scrollframe.png');
this.load.image('pic', 'assets/pics/cougar-face-of-nature.png');
}
create ()
{
this.add.image(0, 0, 'frame').setOrigin(0);
// setDisplaySize will adjust the scale of an image to make it fit the given pixel dimensions:
this.add.image(32, 32, 'pic').setOrigin(0).setDisplaySize(352, 240);
}
}
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
width: 800,
height: 600,
scene: Example
};
const game = new Phaser.Game(config);
В чем проблема ручного масштабирования
Классический способ изменить размер спрайта или изображения — использовать метод setScale. Он умножает исходные размеры текстуры на заданный множитель.
sprite.setScale(0.5, 0.5);
Чтобы вписать изображение в область 352x240 пикселей, вам нужно знать исходный размер текстуры, затем вычислить коэффициент для ширины и высоты. Это лишние расчеты в коде. setDisplaySize делает это за вас.
Работа метода setDisplaySize
Метод setDisplaySize(width, height) принадлежит любому игровому объекту, наследующему от Phaser.GameObjects.Image или Phaser.GameObjects.Sprite. Он автоматически вычисляет и применяет значения масштаба по осям X и Y, чтобы итоговый размер объекта в пикселях стал равен заданным аргументам.
this.add.image(32, 32, 'pic').setOrigin(0).setDisplaySize(352, 240);
В данном примере изображение с ключом 'pic' будет отрисовано с такими значениями scaleX и scaleY, что его ширина станет 352 пикселя, а высота — 240, независимо от исходного разрешения загруженной текстуры. Важно: точка преобразования (origin) установлена в (0, 0) (левый верхний угол), поэтому масштабирование происходит относительно этой точки, и левый верхний угол изображения останется в координатах (32, 32).
Практический пример: Картинка в рамке
Рассмотрим код из примера. Сначала загружается изображение рамки ('frame') и основная картинка ('pic').
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('frame', 'assets/pics/scrollframe.png');
this.load.image('pic', 'assets/pics/cougar-face-of-nature.png');
}
В методе create сначала добавляется рамка в начало координат сцены. Затем добавляется основное изображение. Ключевая строка — вызов setDisplaySize(352, 240). Размеры 352x240 подобраны так, чтобы картинка идеально разместилась внутри видимой области загруженной рамки, с учетом отступа в 32 пикселя от ее края.
create ()
{
this.add.image(0, 0, 'frame').setOrigin(0);
this.add.image(32, 32, 'pic').setOrigin(0).setDisplaySize(352, 240);
}
Таким образом, мы гарантированно и точно размещаем контент внутри UI-элемента без каких-либо предварительных вычислений размеров исходной текстуры.
Отличия от setScale и setSize
Важно не путать три метода:
- setScale(factorX, factorY) — меняет масштаб.
- setSize(width, height) — меняет **прямоугольник взаимодействия** (hit area) объекта, не влияя на его визуальный размер. Используется для физических тел или зон ввода.
- setDisplaySize(width, height) — меняет **визуальный размер** объекта в пикселях, автоматически подстраивая его масштаб.
setDisplaySize — это ваш инструмент, когда вы работаете с целевыми пиксельными размерами из дизайна, а не с относительными коэффициентами.
Что попробовать дальше
Метод setDisplaySize — это мощный и удобный способ контролировать визуальный размер игровых объектов, оперируя понятными пиксельными значениями. Он незаменим для создания интерфейсов, галерей или любого контента, который должен точно вписываться в заданные области.
Попробуйте поэкспериментировать: создайте интерфейс инвентаря с ячейками фиксированного размера и используйте setDisplaySize, чтобы автоматически подгонять в них иконки предметов разного исходного размера.
