NineSlice — это техника, позволяющая создавать масштабируемые графические элементы интерфейса, такие как панели, кнопки и окна, сохраняя при этом пропорции углов и границ. В Phaser эта концепция реализована через специализированные объекты, которые делят изображение на девять частей: четыре угла, четыре стороны и центральную область.
Изображение делится на сетку 3x3:
Такой подход позволяет создавать гибкие интерфейсы, которые адаптируются под разные разрешения экранов без потери качества графики.
Phaser 3 предоставляет класс
Phaser.GameObjects.NineSlice, который наследует свойства
обычного спрайта, но добавляет параметры для настройки девяти
сегментов.
Синтаксис создания:
const panel = this.add.nineslice(x, y, width, height, texture, frame, {
leftWidth: 20,
rightWidth: 20,
topHeight: 20,
bottomHeight: 20
});
Параметры:
x, y — координаты верхнего левого угла
объекта.width, height — итоговый размер
элемента.texture — ключ текстуры, загруженной через
this.load.image.frame — необязательный параметр, если используется
атлас.leftWidth, rightWidth,
topHeight, bottomHeight — размеры областей
углов, не подлежащих масштабированию.Ключевой момент — корректное указание размеров углов. Если они слишком малы, визуальные артефакты будут заметны при растяжении. Если слишком велики — центральная область может стать слишком маленькой.
Пример настройки для кнопки:
const button = this.add.nineslice(100, 100, 200, 60, 'buttonTexture', null, {
leftWidth: 15,
rightWidth: 15,
topHeight: 15,
bottomHeight: 15
});
NineSlice объекты поддерживают интерактивные события:
button.setInteractive()
.on('pointerover', () => button.setAlpha(0.8))
.on('pointerout', () => button.setAlpha(1))
.on('pointerdown', () => console.log('Кнопка нажата'));
setInteractive() делает объект чувствительным к мыши
или касаниям.pointerover, pointerout,
pointerdown, pointerup).NineSlice позволяет изменять размеры объекта в процессе игры без перерисовки текстуры:
button.setSize(250, 80);
Часто NineSlice применяется вместе с текстовыми объектами для создания кнопок и панелей информации:
const label = this.add.text(0, 0, 'Играть', { fontSize: '24px', color: '#ffffff' });
button.add(label);
label.setOrigin(0.5);
label.setPosition(button.width / 2, button.height / 2);
NineSlice в Phaser обеспечивает мощный и гибкий инструмент для создания масштабируемого интерфейса, упрощает работу с адаптивными элементами и позволяет поддерживать консистентный визуальный стиль без необходимости создавать множество текстур разных размеров.